2013-12-06T00:31:44の更新内容

programming/netfx/text_format_conversion/index.wiki.txt

current previous
1,1048 0,0
+
${smdncms:title,テキスト変換・フォーマット変換}
+
${smdncms:keywords,テキスト,フォーマット,エンコード,デコード,変換}
+
${smdncms:document_versions,codelang=cs,codelang=vb}
+

          
+
.NET Frameworkにおけるテキストのエンコード・デコード、エスケープ・アンエスケープ、フォーマット変換、暗号化などについて。
+

          
+
#googleadunit
+

          
+
*文字コード [#charset]
+
文字コードを指定して文字列をバイト配列にエンコードしたり、逆にデコードしたりする場合には&msdn(netfx,type,System.Text.Encoding){System.Text.Encodingクラス};を使います。
+

          
+
#tabpage(codelang=cs,container-title=文字コードを指定したデコード・エンコード)
+
#code{{
+
using System;
+
using System.Text;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    // SHIFT_JISでのエンコード・デコードを行うEncodingを取得する
+
    Encoding e = Encoding.GetEncoding("shift_jis");
+

          
+
    // 文字列をエンコードしてSHIFT_JISのバイト配列に変換する
+
    byte[] bytes = e.GetBytes("日本語");
+

          
+
    Console.WriteLine(BitConverter.ToString(bytes));
+

          
+
    // SHIFT_JISのバイト配列をデコードして文字列に変換する
+
    string str = e.GetString(new byte[] {0x93, 0xFA, 0x96, 0x7B, 0x8C, 0xEA});
+

          
+
    Console.WriteLine(str);
+
  }
+
}
+
}}
+
#tabpage(codelang=vb)
+
#code{{
+
Imports System
+
Imports System.Text
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' SHIFT_JISでのエンコード・デコードを行うEncodingを取得する
+
    Dim e As Encoding = Encoding.GetEncoding("shift_jis")
+

          
+
    ' 文字列をエンコードしてSHIFT_JISのバイト配列に変換する
+
    Dim bytes As Byte() = e.GetBytes("日本語")
+

          
+
    Console.WriteLine(BitConverter.ToString(bytes))
+

          
+
    ' SHIFT_JISのバイト配列をデコードして文字列に変換する
+
    Dim str As String = e.GetString(New Byte() {&h93, &hFA, &h96, &h7B, &h8C, &hEA})
+

          
+
    Console.WriteLine(str)
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(実行結果){{
+
93-FA-96-7B-8C-EA
+
日本語
+
}}
+

          
+
バイト配列を別の文字コードでの表現に変換するには&msdn(netfx,member,System.Text.Encoding.Convert){Encoding.Convertメソッド};を使います。
+

          
+
#tabpage(codelang=cs,container-title=文字コードの変換)
+
#code{{
+
using System;
+
using System.Text;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    // SHIFT_JISの文字列"日本語"のバイト配列表現
+
    byte[] shift_jis = new byte[] {0x93, 0xFA, 0x96, 0x7B, 0x8C, 0xEA};
+

          
+
    Console.WriteLine("SHIFT_JIS: {0}", BitConverter.ToString(shift_jis));
+

          
+
    // バイト配列をSHIFT_JISからUTF-8に変換する
+
    byte[] utf8 = Encoding.Convert(Encoding.GetEncoding("shift_jis"), Encoding.UTF8, shift_jis);
+

          
+
    Console.WriteLine("UTF-8: {0}", BitConverter.ToString(utf8));
+
  }
+
}
+
}}
+
#tabpage(codelang=vb)
+
#code{{
+
Imports System
+
Imports System.Text
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' SHIFT_JISの文字列"日本語"のバイト配列表現
+
    Dim shift_jis As Byte() = New Byte() {&h93, &hFA, &h96, &h7B, &h8C, &hEA}
+

          
+
    Console.WriteLine("SHIFT_JIS: {0}", BitConverter.ToString(shift_jis))
+

          
+
    ' バイト配列をSHIFT_JISからUTF-8に変換する
+
    Dim utf8 As Byte() = Encoding.Convert(Encoding.GetEncoding("shift_jis"), Encoding.UTF8, shift_jis)
+

          
+
    Console.WriteLine("UTF-8: {0}", BitConverter.ToString(utf8))
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(実行結果){{
+
SHIFT_JIS: 93-FA-96-7B-8C-EA
+
UTF-8: E6-97-A5-E6-9C-AC-E8-AA-9E
+
}}
+

          
+
文字コードを指定したファイルの読み書きについては[[programming/netfx/stream/2_streamreader_streamwriter]]で解説しています。 その他、文字コードとEncodingクラスについては以下のページでも解説しています。
+

          
+
-[[programming/netfx/tips/unicode_encoding_bom]] .NET FrameworkにおけるBOMの扱いについて
+
-[[programming/netfx/tips/determine_shiftjis_eucjp]] 文字コードを検出する例
+
-[[programming/netfx/tips/get_textbytecount]]
+
-[[programming/netfx/tips/modified_utf7]]
+

          
+
*Base64 [#base64]
+
バイト配列をBase64に変換するには&msdn(netfx,type,System.Convert){System.Convertクラス};の&msdn(netfx,member,System.Convert.ToBase64String){ToBase64Stringメソッド};・&msdn(netfx,member,System.Convert.FromBase64String){FromBase64Stringメソッド};を使います。 文字列とBase64形式の文字列を直接相互に変換することは出来ないので、その場合にはまず[[文字列をバイト配列に変換>#charset]]してからこれらのメソッドを呼び出す必要があります。
+

          
+
#tabpage(codelang=cs,container-title=Base64の変換)
+
#code{{
+
using System;
+
using System.Text;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    byte[] bytes;
+
    string base64;
+

          
+
    // バイト配列からBase64形式の文字列への変換
+
    bytes = new byte[] {0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47}; // "ABCDEFG"
+
    base64 = Convert.ToBase64String(bytes);
+

          
+
    Console.WriteLine(base64);
+

          
+
    // Base64形式の文字列からバイト配列への変換
+
    base64 = "QUJDREVGRw==";
+
    bytes = Convert.FromBase64String(base64);
+

          
+
    Console.WriteLine(BitConverter.ToString(bytes));
+

          
+
    // 得られたバイト配列をさらに文字列へと変換
+
    Console.WriteLine(Encoding.ASCII.GetString(bytes));
+
  }
+
}
+
}}
+
#tabpage(codelang=vb)
+
#code{{
+
Imports System
+
Imports System.Text
+

          
+
Class Sample
+
  Shared Sub Main()
+
    Dim bytes As Byte()
+
    Dim base64 As String
+

          
+
    ' バイト配列からBase64形式の文字列への変換
+
    bytes = New Byte() {&h41, &h42, &h43, &h44, &h45, &h46, &h47} ' "ABCDEFG"
+
    base64 = Convert.ToBase64String(bytes)
+

          
+
    Console.WriteLine(base64)
+

          
+
    ' Base64形式の文字列からバイト配列への変換
+
    base64 = "QUJDREVGRw=="
+
    bytes = Convert.FromBase64String(base64)
+

          
+
    Console.WriteLine(BitConverter.ToString(bytes))
+

          
+
    ' 得られたバイト配列をさらに文字列へと変換
+
    Console.WriteLine(Encoding.ASCII.GetString(bytes))
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(実行結果){{
+
QUJDREVGRw==
+
41-42-43-44-45-46-47
+
ABCDEFG
+
}}
+

          
+
ToBase64Stringメソッドでは、引数に&msdn(netfx,member,System.Base64FormattingOptions.InsertLineBreaks){Base64FormattingOptions.InsertLineBreaks};を指定すると、Base64への変換に際して76文字ごとに改行を入れるようにすることができます。 Base64でメールの本文をエンコードする場合などに使用することができます。
+

          
+
#tabpage(codelang=cs,container-title=改行を挿入したBase64の変換)
+
#code{{
+
using System;
+
using System.Text;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    byte[] bytes = new byte[] {
+
      0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
+
      0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
+
      0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
+
      0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
+
      0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
+
      0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
+
      0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
+
      0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
+
    };
+

          
+
    // 76文字ごとに改行を含めてBase64に変換する
+
    string base64 = Convert.ToBase64String(bytes, Base64FormattingOptions.InsertLineBreaks);
+

          
+
    Console.WriteLine(base64);
+

          
+
    // 改行を含めずBase64に変換する
+
    base64 = Convert.ToBase64String(bytes, Base64FormattingOptions.None);
+

          
+
    Console.WriteLine(base64);
+
  }
+
}
+
}}
+
#tabpage(codelang=vb)
+
#code{{
+
Imports System
+
Imports System.Text
+

          
+
Class Sample
+
  Shared Sub Main()
+
    Dim bytes As Byte() = New Byte() { _
+
      &h41, &h42, &h43, &h44, &h45, &h46, &h47, &h48, &h49, &h4a, &h4b, &h4c, &h4d, &h4e, &h4f, &h50, _
+
      &h41, &h42, &h43, &h44, &h45, &h46, &h47, &h48, &h49, &h4a, &h4b, &h4c, &h4d, &h4e, &h4f, &h50, _
+
      &h41, &h42, &h43, &h44, &h45, &h46, &h47, &h48, &h49, &h4a, &h4b, &h4c, &h4d, &h4e, &h4f, &h50, _
+
      &h41, &h42, &h43, &h44, &h45, &h46, &h47, &h48, &h49, &h4a, &h4b, &h4c, &h4d, &h4e, &h4f, &h50, _
+
      &h41, &h42, &h43, &h44, &h45, &h46, &h47, &h48, &h49, &h4a, &h4b, &h4c, &h4d, &h4e, &h4f, &h50, _
+
      &h41, &h42, &h43, &h44, &h45, &h46, &h47, &h48, &h49, &h4a, &h4b, &h4c, &h4d, &h4e, &h4f, &h50, _
+
      &h41, &h42, &h43, &h44, &h45, &h46, &h47, &h48, &h49, &h4a, &h4b, &h4c, &h4d, &h4e, &h4f, &h50, _
+
      &h41, &h42, &h43, &h44, &h45, &h46, &h47, &h48, &h49, &h4a, &h4b, &h4c, &h4d, &h4e, &h4f, &h50  _
+
    }
+

          
+
    ' 76文字ごとに改行を含めてBase64に変換する
+
    Dim base64 As String = Convert.ToBase64String(bytes, Base64FormattingOptions.InsertLineBreaks)
+

          
+
    Console.WriteLine(base64)
+

          
+
    ' 改行を含めずBase64に変換する
+
    base64 = Convert.ToBase64String(bytes, Base64FormattingOptions.None)
+

          
+
    Console.WriteLine(base64)
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(実行結果){{
+
QUJDREVGR0hJSktMTU5PUEFCQ0RFRkdISUpLTE1OT1BBQkNERUZHSElKS0xNTk9QQUJDREVGR0hJ
+
SktMTU5PUEFCQ0RFRkdISUpLTE1OT1BBQkNERUZHSElKS0xNTk9QQUJDREVGR0hJSktMTU5PUEFC
+
Q0RFRkdISUpLTE1OT1A=
+
QUJDREVGR0hJSktMTU5PUEFCQ0RFRkdISUpLTE1OT1BBQkNERUZHSElKS0xNTk9QQUJDREVGR0hJSktMTU5PUEFCQ0RFRkdISUpLTE1OT1BBQkNERUZHSElKS0xNTk9QQUJDREVGR0hJSktMTU5PUEFCQ0RFRkdISUpLTE1OT1A=
+
}}
+

          
+
[[ストリーム>programming/netfx/stream/0_abstract]]をBase64で変換したり、Base64形式でファイルの読み書きをする場合には、&msdn(netfx,ns,System.Security.Cryptography){System.Security.Cryptography名前空間};の&msdn(netfx,type,System.Security.Cryptography.CryptoStream){CryptoStream};と&msdn(netfx,type,System.Security.Cryptography.ToBase64Transform){ToBase64Transform};・&msdn(netfx,type,System.Security.Cryptography.FromBase64Transform){FromBase64Transform};を組み合わせて使います。
+

          
+
次のコードは、Base64・UTF-8でエンコードしてファイルを読み書きする例です。
+

          
+
#tabpage(codelang=cs,container-title=Base64形式でのファイルの読み書き)
+
#code{{
+
using System;
+
using System.IO;
+
using System.Security.Cryptography;
+
using System.Text;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    // ファイルbase64.txtに書き込むストリームを作成する
+
    using (FileStream fileStream = new FileStream("base64.txt", FileMode.Create, FileAccess.Write)) {
+
      // Base64への変換を行った上でfileStreamに書き込みを行うCryptoStreamを作成する
+
      using (CryptoStream base64Stream = new CryptoStream(fileStream, new ToBase64Transform(), CryptoStreamMode.Write)) {
+
        // UTF-8にエンコードして書き込むStreamWriterを作成する
+
        using (StreamWriter writer = new StreamWriter(base64Stream, Encoding.UTF8)) {
+
          // ファイルに文字列を書き込む
+
          writer.WriteLine("かごめかごめ");
+
          writer.WriteLine("かごのなかのとりは");
+
          writer.WriteLine("いついつでやる");
+
        }
+
      }
+
    }
+

          
+
    // ファイルbase64.txtを読み込むストリームを作成する
+
    using (FileStream fileStream = new FileStream("base64.txt", FileMode.Open, FileAccess.Read)) {
+
      // fileStreamから読み込んだ後にBase64からの変換を行うCryptoStreamを作成する
+
      using (CryptoStream base64Stream = new CryptoStream(fileStream, new FromBase64Transform(), CryptoStreamMode.Read)) {
+
        // UTF-8でデコードして読み込むStreamReaderを作成する
+
        using (StreamReader reader = new StreamReader(base64Stream, Encoding.UTF8)) {
+
          // ファイル全体を読み込んで表示する
+
          Console.Write(reader.ReadToEnd());
+
        }
+
      }
+
    }
+
  }
+
}
+
}}
+
#tabpage(codelang=vb)
+
#code{{
+
Imports System
+
Imports System.IO
+
Imports System.Security.Cryptography
+
Imports System.Text
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' ファイルbase64.txtに書き込むストリームを作成する
+
    Using fileStream As New FileStream("base64.txt", FileMode.Create, FileAccess.Write)
+
      ' Base64への変換を行った上でfileStreamに書き込みを行うCryptoStreamを作成する
+
      Using base64Stream As New CryptoStream(fileStream, New ToBase64Transform(), CryptoStreamMode.Write)
+
        ' UTF-8にエンコードして書き込むStreamWriterを作成する
+
        Using writer As New StreamWriter(base64Stream, Encoding.UTF8)
+
          ' ファイルに文字列を書き込む
+
          writer.WriteLine("かごめかごめ")
+
          writer.WriteLine("かごのなかのとりは")
+
          writer.WriteLine("いついつでやる")
+
        End Using
+
      End Using
+
    End Using
+

          
+
    ' ファイルbase64.txtを読み込むストリームを作成する
+
    Using fileStream As New FileStream("base64.txt", FileMode.Open, FileAccess.Read)
+
      ' fileStreamから読み込んだ後にBase64からの変換を行うCryptoStreamを作成する
+
      Using base64Stream As New CryptoStream(fileStream, New FromBase64Transform(), CryptoStreamMode.Read)
+
        ' UTF-8でデコードして読み込むStreamReaderを作成する
+
        Using reader As New StreamReader(base64Stream, Encoding.UTF8)
+
          ' ファイル全体を読み込んで表示する
+
          Console.Write(reader.ReadToEnd())
+
        End Using
+
      End Using
+
    End Using
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(base64.txtに書き込まれる内容){{
+
77u/44GL44GU44KB44GL44GU44KBCuOBi+OBlOOBruOBquOBi+OBruOBqOOCiuOBrwrjgYTjgaTjgYTjgaTjgafjgoTjgosK
+
}}
+

          
+
#prompt(実行結果){{
+
かごめかごめ
+
かごのなかのとりは
+
いついつでやる
+
}}
+

          
+
このコードでは、次のようにしてBase64・UTF-8への変換が行われます。
+

          
+

          
+
 [文字列] → StreamWriter+Encoding(UTF-8のバイト配列へ変換) → CryptoStream+ToBase64Transform(Base64へ変換) → FileStream(ファイルへ書き込み) → [ファイル]
+
 
+
 [文字列] ← StreamReader+Encoding(UTF-8の文字列へ変換) ← CryptoStream+FromBase64Transform(Base64から変換) ← FileStream(ファイルから読み込み) ← [ファイル]
+

          
+

          
+
ストリームを多段に重ねて使う方法については[[programming/netfx/stream/0_abstract]]、StreamWriter・StreamReaderについては[[programming/netfx/stream/2_streamreader_streamwriter]]で詳しく解説しています。
+

          
+

          
+

          
+
*quoted-printable [#quoted-printable]
+
.NET Frameworkにはquoted-printableのエンコード・デコードを行うクラスやメソッドは用意されていません。 必要な場合は独自に実装する必要があります。
+

          
+
実装例:[[programming/netfx/tips/quoted_printable]]、[[works/libs/Smdn.Formats.Mime]]
+

          
+

          
+

          
+
*MIMEエンコード (Qエンコード・Bエンコード) [#mime_encode]
+
.NET FrameworkにはMIMEエンコード・デコードを行うクラスやメソッドは用意されていません。 必要な場合は[[BASE64の変換>#base64]]・[[quoted-printableの変換>#quoted-printable]]・[[文字コードの変換>#charset]]を組み合わせて独自に実装する必要があります。
+

          
+
実装例:[[works/libs/Smdn.Formats.Mime]]
+

          
+

          
+

          
+
*URLエンコード・パーセントエンコード [#percent_encode]
+
**エンコード
+
URLエンコード(パーセントエンコード)を行うメソッドには次の4つを使うことができます。 それぞれの違いは次のとおりです。
+

          
+
|*URLエンコードを行うメソッド
+
|~メソッド|~動作と適用範囲|~文字コード|~必要アセンブリ・バージョン|h
+
|&msdn(netfx,member,System.Uri.EscapeUriString);|{{
+
``/`` ``#`` ``&`` ``=`` ``?``などURIで特別な意味を持つ記号は変換されない
+
(URIとして使用する文字列を変換する際にはこのメソッドを使用する)
+
}}|常にUTF-8でエンコードされる|System.dll&br;(.NET Framework 1.0以降)|
+
|&msdn(netfx,member,System.Uri.EscapeDataString);|{{
+
``/`` ``#`` ``&`` ``=`` ``?``などの記号も変換される
+
(URIのクエリ部分などに使用する文字列を変換する際にはこのメソッドを使用する)
+
}}|~|System.dll&br;(.NET Framework 1.0以降)|
+
|&msdn(netfx,member,System.Net.WebUtility.UrlEncode);|~|~|System.dll&br;(.NET Framework 4.5以降)|
+
|&msdn(netfx,member,System.Web.dll,System.Web.HttpUtility.UrlEncode);|~|任意の[[Encoding>#charset]]を指定してエンコードできる|System.Web.dll&br;(.NET Framework 1.1以降)|
+

          
+
#tabpage(codelang=cs,container-title=URLエンコード)
+
#code{{
+
using System;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    string str = "http://example.com/search?q=URL エスケープ&max=10";
+

          
+
    Console.WriteLine(System.Uri.EscapeUriString(str));
+
    Console.WriteLine(System.Uri.EscapeDataString(str));
+
    Console.WriteLine(System.Net.WebUtility.UrlEncode(str));
+
    Console.WriteLine(System.Web.HttpUtility.UrlEncode(str));
+
  }
+
}
+
}}
+
#tabpage(codelang=vb)
+
#code{{
+
Imports System
+

          
+
Class Sample
+
  Shared Sub Main()
+
    Dim str As String = "http://example.com/search?q=URL エスケープ&max=10"
+

          
+
    Console.WriteLine(System.Uri.EscapeUriString(str))
+
    Console.WriteLine(System.Uri.EscapeDataString(str))
+
    Console.WriteLine(System.Net.WebUtility.UrlEncode(str))
+
    Console.WriteLine(System.Web.HttpUtility.UrlEncode(str))
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(実行結果){{
+
http://example.com/search?q=URL%20%E3%82%A8%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%97&max=10
+
http%3A%2F%2Fexample.com%2Fsearch%3Fq%3DURL%20%E3%82%A8%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%97%26max%3D10
+
http%3A%2F%2Fexample.com%2Fsearch%3Fq%3DURL+%E3%82%A8%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%97%26max%3D10
+
http%3a%2f%2fexample.com%2fsearch%3fq%3dURL+%e3%82%a8%e3%82%b9%e3%82%b1%e3%83%bc%e3%83%97%26max%3d10
+
}}
+

          
+
これらのメソッドの変換結果には細かな違いがあり、変換される記号の違いのほか、空白(0x20)を``%20``に変換するか``+``に変換するか、大文字小文字どちらにエンコードされるか、といった違いがあります。
+

          
+
さらにUri.EscapeUriString・Uri.EscapeDataStringについては、.NET Framework 4.0までは&urn2url(urn:ietf:rfc:2396,short);に基づいて変換を行いますが、.NET Framework 4.5以降では&urn2url(urn:ietf:rfc:3986,short);に基づいて変換されるように動作が変更されているという点にも注意が必要です。
+

          
+
0x20から0x7fまでの文字と各メソッドの変換結果の違いを表にすると次のようになります。
+

          
+

          
+
|*0x20から0x3fまでの文字とエンコード結果
+
||&monospace{ };|&monospace{!};|&monospace{"};|&monospace{#};|&monospace{$};|&monospace{%};|&monospace{&};|&monospace{'};|&monospace{(};|&monospace{)};|&monospace{*};|&monospace{+};|&monospace{,};|&monospace{-};|&monospace{.};|&monospace{/};|&monospace{0};|&monospace{1};|&monospace{2};|&monospace{3};|&monospace{4};|&monospace{5};|&monospace{6};|&monospace{7};|&monospace{8};|&monospace{9};|&monospace{:};|&monospace{;};|&monospace{<};|&monospace{=};|&monospace{>};|&monospace{?};|h
+
|Uri.EscapeUriString (.NET 4.5以降)|&monospace{%20};|&monospace{!};|&monospace{%22};|&monospace{#};|&monospace{$};|&monospace{%25};|&monospace{&};|&monospace{'};|&monospace{(};|&monospace{)};|&monospace{*};|&monospace{+};|&monospace{,};|&monospace{-};|&monospace{.};|&monospace{/};|&monospace{0};|&monospace{1};|&monospace{2};|&monospace{3};|&monospace{4};|&monospace{5};|&monospace{6};|&monospace{7};|&monospace{8};|&monospace{9};|&monospace{:};|&monospace{;};|&monospace{%3C};|&monospace{=};|&monospace{%3E};|&monospace{?};|
+
|Uri.EscapeUriString (.NET 4.0まで)|&monospace{%20};|&monospace{!};|&monospace{%22};|&monospace{#};|&monospace{$};|&monospace{%25};|&monospace{&};|&monospace{'};|&monospace{(};|&monospace{)};|&monospace{*};|&monospace{+};|&monospace{,};|&monospace{-};|&monospace{.};|&monospace{/};|&monospace{0};|&monospace{1};|&monospace{2};|&monospace{3};|&monospace{4};|&monospace{5};|&monospace{6};|&monospace{7};|&monospace{8};|&monospace{9};|&monospace{:};|&monospace{;};|&monospace{%3C};|&monospace{=};|&monospace{%3E};|&monospace{?};|
+
|Uri.EscapeDataString (.NET 4.5以降)|&monospace{%20};|&monospace{%21};|&monospace{%22};|&monospace{%23};|&monospace{%24};|&monospace{%25};|&monospace{%26};|&monospace{%27};|&monospace{%28};|&monospace{%29};|&monospace{%2A};|&monospace{%2B};|&monospace{%2C};|&monospace{-};|&monospace{.};|&monospace{%2F};|&monospace{0};|&monospace{1};|&monospace{2};|&monospace{3};|&monospace{4};|&monospace{5};|&monospace{6};|&monospace{7};|&monospace{8};|&monospace{9};|&monospace{%3A};|&monospace{%3B};|&monospace{%3C};|&monospace{%3D};|&monospace{%3E};|&monospace{%3F};|
+
|Uri.EscapeDataString (.NET 4.0まで)|&monospace{%20};|&monospace{!};|&monospace{%22};|&monospace{%23};|&monospace{%24};|&monospace{%25};|&monospace{%26};|&monospace{'};|&monospace{(};|&monospace{)};|&monospace{*};|&monospace{%2B};|&monospace{%2C};|&monospace{-};|&monospace{.};|&monospace{%2F};|&monospace{0};|&monospace{1};|&monospace{2};|&monospace{3};|&monospace{4};|&monospace{5};|&monospace{6};|&monospace{7};|&monospace{8};|&monospace{9};|&monospace{%3A};|&monospace{%3B};|&monospace{%3C};|&monospace{%3D};|&monospace{%3E};|&monospace{%3F};|
+
|WebUtility.UrlEncode|&monospace{+};|&monospace{!};|&monospace{%22};|&monospace{%23};|&monospace{%24};|&monospace{%25};|&monospace{%26};|&monospace{%27};|&monospace{(};|&monospace{)};|&monospace{*};|&monospace{%2B};|&monospace{%2C};|&monospace{-};|&monospace{.};|&monospace{%2F};|&monospace{0};|&monospace{1};|&monospace{2};|&monospace{3};|&monospace{4};|&monospace{5};|&monospace{6};|&monospace{7};|&monospace{8};|&monospace{9};|&monospace{%3A};|&monospace{%3B};|&monospace{%3C};|&monospace{%3D};|&monospace{%3E};|&monospace{%3F};|
+
|HttpUtility.UrlEncode|&monospace{+};|&monospace{!};|&monospace{%22};|&monospace{%23};|&monospace{%24};|&monospace{%25};|&monospace{%26};|&monospace{%27};|&monospace{(};|&monospace{)};|&monospace{*};|&monospace{%2b};|&monospace{%2c};|&monospace{-};|&monospace{.};|&monospace{%2f};|&monospace{0};|&monospace{1};|&monospace{2};|&monospace{3};|&monospace{4};|&monospace{5};|&monospace{6};|&monospace{7};|&monospace{8};|&monospace{9};|&monospace{%3a};|&monospace{%3b};|&monospace{%3c};|&monospace{%3d};|&monospace{%3e};|&monospace{%3f};|
+

          
+
|*0x40から0x5fまでの文字とエンコード結果
+
||&monospace{@};|&monospace{A};|&monospace{B};|&monospace{C};|&monospace{D};|&monospace{E};|&monospace{F};|&monospace{G};|&monospace{H};|&monospace{I};|&monospace{J};|&monospace{K};|&monospace{L};|&monospace{M};|&monospace{N};|&monospace{O};|&monospace{P};|&monospace{Q};|&monospace{R};|&monospace{S};|&monospace{T};|&monospace{U};|&monospace{V};|&monospace{W};|&monospace{X};|&monospace{Y};|&monospace{Z};|&monospace{[};|&monospace{\};|&monospace{]};|&monospace{^};|&monospace{_};|h
+
|Uri.EscapeUriString (.NET 4.5以降)|&monospace{@};|&monospace{A};|&monospace{B};|&monospace{C};|&monospace{D};|&monospace{E};|&monospace{F};|&monospace{G};|&monospace{H};|&monospace{I};|&monospace{J};|&monospace{K};|&monospace{L};|&monospace{M};|&monospace{N};|&monospace{O};|&monospace{P};|&monospace{Q};|&monospace{R};|&monospace{S};|&monospace{T};|&monospace{U};|&monospace{V};|&monospace{W};|&monospace{X};|&monospace{Y};|&monospace{Z};|&monospace{[};|&monospace{%5C};|&monospace{]};|&monospace{%5E};|&monospace{_};|
+
|Uri.EscapeUriString (.NET 4.0まで)|&monospace{@};|&monospace{A};|&monospace{B};|&monospace{C};|&monospace{D};|&monospace{E};|&monospace{F};|&monospace{G};|&monospace{H};|&monospace{I};|&monospace{J};|&monospace{K};|&monospace{L};|&monospace{M};|&monospace{N};|&monospace{O};|&monospace{P};|&monospace{Q};|&monospace{R};|&monospace{S};|&monospace{T};|&monospace{U};|&monospace{V};|&monospace{W};|&monospace{X};|&monospace{Y};|&monospace{Z};|&monospace{%5B};|&monospace{%5C};|&monospace{%5D};|&monospace{%5E};|&monospace{_};|
+
|Uri.EscapeDataString (.NET 4.5以降)|&monospace{%40};|&monospace{A};|&monospace{B};|&monospace{C};|&monospace{D};|&monospace{E};|&monospace{F};|&monospace{G};|&monospace{H};|&monospace{I};|&monospace{J};|&monospace{K};|&monospace{L};|&monospace{M};|&monospace{N};|&monospace{O};|&monospace{P};|&monospace{Q};|&monospace{R};|&monospace{S};|&monospace{T};|&monospace{U};|&monospace{V};|&monospace{W};|&monospace{X};|&monospace{Y};|&monospace{Z};|&monospace{%5B};|&monospace{%5C};|&monospace{%5D};|&monospace{%5E};|&monospace{_};|
+
|Uri.EscapeDataString (.NET 4.0まで)|&monospace{%40};|&monospace{A};|&monospace{B};|&monospace{C};|&monospace{D};|&monospace{E};|&monospace{F};|&monospace{G};|&monospace{H};|&monospace{I};|&monospace{J};|&monospace{K};|&monospace{L};|&monospace{M};|&monospace{N};|&monospace{O};|&monospace{P};|&monospace{Q};|&monospace{R};|&monospace{S};|&monospace{T};|&monospace{U};|&monospace{V};|&monospace{W};|&monospace{X};|&monospace{Y};|&monospace{Z};|&monospace{%5B};|&monospace{%5C};|&monospace{%5D};|&monospace{%5E};|&monospace{_};|
+
|WebUtility.UrlEncode|&monospace{%40};|&monospace{A};|&monospace{B};|&monospace{C};|&monospace{D};|&monospace{E};|&monospace{F};|&monospace{G};|&monospace{H};|&monospace{I};|&monospace{J};|&monospace{K};|&monospace{L};|&monospace{M};|&monospace{N};|&monospace{O};|&monospace{P};|&monospace{Q};|&monospace{R};|&monospace{S};|&monospace{T};|&monospace{U};|&monospace{V};|&monospace{W};|&monospace{X};|&monospace{Y};|&monospace{Z};|&monospace{%5B};|&monospace{%5C};|&monospace{%5D};|&monospace{%5E};|&monospace{_};|
+
|HttpUtility.UrlEncode|&monospace{%40};|&monospace{A};|&monospace{B};|&monospace{C};|&monospace{D};|&monospace{E};|&monospace{F};|&monospace{G};|&monospace{H};|&monospace{I};|&monospace{J};|&monospace{K};|&monospace{L};|&monospace{M};|&monospace{N};|&monospace{O};|&monospace{P};|&monospace{Q};|&monospace{R};|&monospace{S};|&monospace{T};|&monospace{U};|&monospace{V};|&monospace{W};|&monospace{X};|&monospace{Y};|&monospace{Z};|&monospace{%5b};|&monospace{%5c};|&monospace{%5d};|&monospace{%5e};|&monospace{_};|
+

          
+
|*0x60から0x7fまでの文字とエンコード結果
+
||&monospace{`};|&monospace{a};|&monospace{b};|&monospace{c};|&monospace{d};|&monospace{e};|&monospace{f};|&monospace{g};|&monospace{h};|&monospace{i};|&monospace{j};|&monospace{k};|&monospace{l};|&monospace{m};|&monospace{n};|&monospace{o};|&monospace{p};|&monospace{q};|&monospace{r};|&monospace{s};|&monospace{t};|&monospace{u};|&monospace{v};|&monospace{w};|&monospace{x};|&monospace{y};|&monospace{z};|&monospace{{};|&monospace{&#x7c;};|&monospace{}};|&monospace{~};|&monospace{};|h
+
|Uri.EscapeUriString (.NET 4.5以降)|&monospace{%60};|&monospace{a};|&monospace{b};|&monospace{c};|&monospace{d};|&monospace{e};|&monospace{f};|&monospace{g};|&monospace{h};|&monospace{i};|&monospace{j};|&monospace{k};|&monospace{l};|&monospace{m};|&monospace{n};|&monospace{o};|&monospace{p};|&monospace{q};|&monospace{r};|&monospace{s};|&monospace{t};|&monospace{u};|&monospace{v};|&monospace{w};|&monospace{x};|&monospace{y};|&monospace{z};|&monospace{%7B};|&monospace{%7C};|&monospace{%7D};|&monospace{~};|&monospace{%7F};|
+
|Uri.EscapeUriString (.NET 4.0まで)|&monospace{%60};|&monospace{a};|&monospace{b};|&monospace{c};|&monospace{d};|&monospace{e};|&monospace{f};|&monospace{g};|&monospace{h};|&monospace{i};|&monospace{j};|&monospace{k};|&monospace{l};|&monospace{m};|&monospace{n};|&monospace{o};|&monospace{p};|&monospace{q};|&monospace{r};|&monospace{s};|&monospace{t};|&monospace{u};|&monospace{v};|&monospace{w};|&monospace{x};|&monospace{y};|&monospace{z};|&monospace{%7B};|&monospace{%7C};|&monospace{%7D};|&monospace{~};|&monospace{%7F};|
+
|Uri.EscapeDataString (.NET 4.5以降)|&monospace{%60};|&monospace{a};|&monospace{b};|&monospace{c};|&monospace{d};|&monospace{e};|&monospace{f};|&monospace{g};|&monospace{h};|&monospace{i};|&monospace{j};|&monospace{k};|&monospace{l};|&monospace{m};|&monospace{n};|&monospace{o};|&monospace{p};|&monospace{q};|&monospace{r};|&monospace{s};|&monospace{t};|&monospace{u};|&monospace{v};|&monospace{w};|&monospace{x};|&monospace{y};|&monospace{z};|&monospace{%7B};|&monospace{%7C};|&monospace{%7D};|&monospace{~};|&monospace{%7F};|
+
|Uri.EscapeDataString (.NET 4.0まで)|&monospace{%60};|&monospace{a};|&monospace{b};|&monospace{c};|&monospace{d};|&monospace{e};|&monospace{f};|&monospace{g};|&monospace{h};|&monospace{i};|&monospace{j};|&monospace{k};|&monospace{l};|&monospace{m};|&monospace{n};|&monospace{o};|&monospace{p};|&monospace{q};|&monospace{r};|&monospace{s};|&monospace{t};|&monospace{u};|&monospace{v};|&monospace{w};|&monospace{x};|&monospace{y};|&monospace{z};|&monospace{%7B};|&monospace{%7C};|&monospace{%7D};|&monospace{~};|&monospace{%7F};|
+
|WebUtility.UrlEncode|&monospace{%60};|&monospace{a};|&monospace{b};|&monospace{c};|&monospace{d};|&monospace{e};|&monospace{f};|&monospace{g};|&monospace{h};|&monospace{i};|&monospace{j};|&monospace{k};|&monospace{l};|&monospace{m};|&monospace{n};|&monospace{o};|&monospace{p};|&monospace{q};|&monospace{r};|&monospace{s};|&monospace{t};|&monospace{u};|&monospace{v};|&monospace{w};|&monospace{x};|&monospace{y};|&monospace{z};|&monospace{%7B};|&monospace{%7C};|&monospace{%7D};|&monospace{%7E};|&monospace{%7F};|
+
|HttpUtility.UrlEncode|&monospace{%60};|&monospace{a};|&monospace{b};|&monospace{c};|&monospace{d};|&monospace{e};|&monospace{f};|&monospace{g};|&monospace{h};|&monospace{i};|&monospace{j};|&monospace{k};|&monospace{l};|&monospace{m};|&monospace{n};|&monospace{o};|&monospace{p};|&monospace{q};|&monospace{r};|&monospace{s};|&monospace{t};|&monospace{u};|&monospace{v};|&monospace{w};|&monospace{x};|&monospace{y};|&monospace{z};|&monospace{%7b};|&monospace{%7c};|&monospace{%7d};|&monospace{%7e};|&monospace{%7f};|
+

          
+

          
+
#commentout{{{
+
using System;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    var funcs = new[] {
+
      (Func<string, string>)(s => s),
+
      (Func<string, string>)System.Uri.EscapeUriString,
+
      (Func<string, string>)System.Uri.EscapeDataString,
+
      (Func<string, string>)System.Net.WebUtility.UrlEncode,
+
      (Func<string, string>)System.Web.HttpUtility.UrlEncode,
+
    };
+

          
+
    foreach (var range in new[] {
+
      Tuple.Create(0x20, 0x3f),
+
      Tuple.Create(0x40, 0x5f),
+
      Tuple.Create(0x60, 0x7f),
+
    }) {
+
      Console.WriteLine("|*0x{0:x}から0x{1:x}までの文字とエンコード結果", range.Item1, range.Item2);
+
      bool header = true;
+
      foreach (var func in funcs) {
+
        Console.Write("|{0}.{1}|", func.Method.DeclaringType.Name, func.Method.Name);
+

          
+
        for (var c = range.Item1; c <= range.Item2; c++) {
+
          Console.Write("&monospace{{{0}}};|", func(((char)c).ToString()).Replace("|", "&#x7c;"));
+
        }
+

          
+
        if (header) {
+
          header = false;
+
          Console.WriteLine("h");
+
        }
+
        else {
+
          Console.WriteLine();
+
        }
+
      }
+
      Console.WriteLine();
+
    }
+
  }
+
}
+
}}}
+

          
+
**デコード
+
URLエンコード(パーセントエンコード)された文字列のデコードを行うには次の3つのメソッドを使うことができます。 それぞれの違いは次のとおりです。
+

          
+
|*URLエンコードを行うメソッド
+
|~メソッド|~動作|~文字コード|~必要アセンブリ・バージョン|h
+
|&msdn(netfx,member,System.Uri.UnescapeDataString);|{{
+
文字列中の``+``はそのままデコードされる
+
}}|常にUTF-8でデコードされる|System.dll&br;(.NET Framework 1.0以降)|
+
|&msdn(netfx,member,System.Net.WebUtility.UrlDecode);|{{
+
文字列中の``+``はデコード時に空白に変換される
+
}}|~|System.dll&br;(.NET Framework 4.5以降)|
+
|&msdn(netfx,member,System.Web.dll,System.Web.HttpUtility.UrlDecode);|~|任意の[[Encoding>#charset]]を指定してデコードできる|System.Web.dll&br;(.NET Framework 1.1以降)|
+

          
+
#tabpage(codelang=cs,container-title=URLエンコードされた文字列のデコード)
+
#code{{
+
using System;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    string str = "http://example.com/search?q=URL+%E3%82%A8%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%97&max=10";
+

          
+
    Console.WriteLine(System.Uri.UnescapeDataString(str));
+
    Console.WriteLine(System.Net.WebUtility.UrlDecode(str));
+
    Console.WriteLine(System.Web.HttpUtility.UrlDecode(str));
+
  }
+
}
+
}}
+
#tabpage(codelang=vb)
+
#code{{
+
Imports System
+

          
+
Class Sample
+
  Shared Sub Main()
+
    Dim str As String = "http://example.com/search?q=URL+%E3%82%A8%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%97&max=10"
+

          
+
    Console.WriteLine(System.Uri.UnescapeDataString(str))
+
    Console.WriteLine(System.Net.WebUtility.UrlDecode(str))
+
    Console.WriteLine(System.Web.HttpUtility.UrlDecode(str))
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(実行結果){{
+
http://example.com/search?q=URL+エスケープ&max=10
+
http://example.com/search?q=URL エスケープ&max=10
+
http://example.com/search?q=URL エスケープ&max=10
+
}}
+

          
+
デコードする文字列と``+``の扱いについては[[programming/netfx/tips/decode_unescape_url]]でも解説しています。
+

          
+

          
+
*HTMLエンコード・エンティティ化 [#html_encode]
+
.NET Framework 4.5以降では、&msdn(netfx,type,System.Net.WebUtility){System.Net.WebUtilityクラス};の&msdn(netfx,member,System.Net.WebUtility.HtmlEncode){HtmlEncode};・&msdn(netfx,member,System.Net.WebUtility.HtmlDecode){HtmlDecode};メソッドを使うことでHTMLエンコードを行うことができます。 HtmlEncodeメソッドでは、``"`` ``&`` ``<`` ``>``に加えて``'``の計5つの記号がエンコードされます。 HtmlDecodeメソッドでは、``&amp;apos;`` ``&amp;quot;`` ``&amp;amp;`` ``&amp;lt;`` ``&amp;gt;``がデコードされるほか、10進・16進の数値文字参照(エンティティ)もデコードされます。
+

          
+
#tabpage(codelang=cs,container-title=HTMLエンコード・デコード)
+
#code{{
+
using System;
+
using System.Net;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    // HTMLエンコード
+
    Console.WriteLine(WebUtility.HtmlEncode("'\"&<>"));
+
    Console.WriteLine(WebUtility.HtmlEncode("<script>alert('Hello, world!');</script>"));
+

          
+
    // HTMLデコード
+
    Console.WriteLine(WebUtility.HtmlDecode("&apos;&quot;&amp;&lt;&gt;"));
+
    Console.WriteLine(WebUtility.HtmlDecode("&#65;&#66;&#67;&#x41;&#x42;&#x43;&#x65e5;&#x672c;&#x8a9e;"));
+
  }
+
}
+
}}
+
#tabpage(codelang=vb)
+
#code{{
+
Imports System
+
Imports System.Net
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' HTMLエンコード
+
    Console.WriteLine(WebUtility.HtmlEncode("'""&<>"))
+
    Console.WriteLine(WebUtility.HtmlEncode("<script>alert('Hello, world!');</script>"))
+

          
+
    ' HTMLデコード
+
    Console.WriteLine(WebUtility.HtmlDecode("&apos;&quot;&amp;&lt;&gt;"))
+
    Console.WriteLine(WebUtility.HtmlDecode("&#65;&#66;&#67;&#x41;&#x42;&#x43;&#x65e5;&#x672c;&#x8a9e;"))
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(実行結果){{
+
&#39;&quot;&amp;&lt;&gt;
+
&lt;script&gt;alert(&#39;Hello, world!&#39;);&lt;/script&gt;
+
'"&<>
+
ABCABC日本語
+
}}
+

          
+
4.5より前の.NET FrameworkやASP.NETでは、System.Web.dllにある&msdn(netfx,type,System.Web.dll,System.Web.HttpUtility){System.Web.HttpUtilityクラス};の&msdn(netfx,member,System.Web.dll,System.Web.HttpUtility.HtmlEncode){HtmlEncode};・&msdn(netfx,member,System.Web.dll,System.Web.HttpUtility.HtmlDecode){HtmlDecode};メソッドを使うことで同様のことを行えます。
+

          
+
一部の記号だけでなくすべての文字を数値文字参照に変換(エンティティ化)するメソッドは用意されていないので、次の例のように独自に実装する必要があります。
+

          
+
#tabpage(codelang=cs,container-title=文字列のHTMLエンティティ化)
+
#code{{
+
using System;
+
using System.Net;
+
using System.Text;
+

          
+
class Sample {
+
  // 文字列を16進または10進形式でHTMLエンティティ化する
+
  static string HtmlEntitize(string str, bool hex)
+
  {
+
    StringBuilder ret = new StringBuilder(str.Length * 6);
+

          
+
    // 1文字ずつエンティティ化する
+
    if (hex) {
+
      foreach (char c in str) {
+
        ret.AppendFormat("&#x{0:x};", (int)c);
+
      }
+
    }
+
    else {
+
      foreach (char c in str) {
+
        ret.AppendFormat("&#{0:d};", (int)c);
+
      }
+
    }
+

          
+
    return ret.ToString();
+
  }
+

          
+
  static void Main()
+
  {
+
    string hexEntitized = HtmlEntitize("foo@example.net", true); // 16進数でエンティティ化
+
    string decEntitized = HtmlEntitize("foo@example.net", false); // 10進数でエンティティ化
+

          
+
    Console.WriteLine(hexEntitized);
+
    Console.WriteLine(decEntitized);
+

          
+
    // エンティティ化したものをWebUtility.HtmnlDecodeで元に戻す
+
    Console.WriteLine(WebUtility.HtmlDecode(hexEntitized));
+
    Console.WriteLine(WebUtility.HtmlDecode(decEntitized));
+
  }
+
}
+
}}
+
#tabpage(codelang=vb)
+
#code{{
+
Imports System
+
Imports System.Net
+
Imports System.Text
+

          
+
Class Sample
+
  ' 文字列を16進または10進形式でHTMLエンティティ化する
+
  Shared Function HtmlEntitize(ByVal str As String, ByVal hex As Boolean) As String
+
    Dim ret As New StringBuilder(str.Length * 6)
+

          
+
    ' 1文字ずつエンティティ化する
+
    If hex Then
+
      For Each c As Char In str
+
        ret.AppendFormat("&#x{0:x};", AscW(c))
+
      Next
+
    Else
+
      For Each c As Char In str
+
        ret.AppendFormat("&#{0:d};", AscW(c))
+
      Next
+
    End If
+

          
+
    Return ret.ToString()
+
  End Function
+

          
+
  Shared Sub Main()
+
    Dim hexEntitized As String = HtmlEntitize("foo@example.net", True) ' 16進数でエンティティ化
+
    Dim decEntitized As String = HtmlEntitize("foo@example.net", False) ' 10進数でエンティティ化
+

          
+
    Console.WriteLine(hexEntitized)
+
    Console.WriteLine(decEntitized)
+

          
+
    ' エンティティ化したものをWebUtility.HtmnlDecodeで元に戻す
+
    Console.WriteLine(WebUtility.HtmlDecode(hexEntitized))
+
    Console.WriteLine(WebUtility.HtmlDecode(decEntitized))
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(実行結果){{
+
&#x66;&#x6f;&#x6f;&#x40;&#x65;&#x78;&#x61;&#x6d;&#x70;&#x6c;&#x65;&#x2e;&#x6e;&#x65;&#x74;
+
&#102;&#111;&#111;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#110;&#101;&#116;
+
foo@example.net
+
foo@example.net
+
}}
+

          
+

          
+

          
+
*日付と時刻 [#date_time]
+
&msdn(netfx,member,System.DateTime.ToString){DateTime.ToStringメソッド};の引数に書式を指定することにより、日時をよく使われる形式の文字列へと変換することができます。 書式指定子``"r"``を指定するとRFC1123形式、``"o"``を指定するとISO8601(W3C-DTF)形式の文字列に変換できます。
+

          
+
#tabpage(codelang=cs,container-title=書式を指定した日時の文字列化)
+
#code{{
+
using System;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    DateTime dt = new DateTime(2013, 12, 3, 4, 5, 6);
+

          
+
    Console.WriteLine(dt.ToString("r")); // RFC1123形式で日時を文字列化
+
    Console.WriteLine(dt.ToString("o")); // ISO8601(W3C-DTF)形式で日時を文字列化
+
    Console.WriteLine();
+

          
+
    DateTimeOffset dto = new DateTimeOffset(2013, 12, 3, 4, 5, 6, TimeSpan.FromHours(+9)); // 日時とオフセット
+

          
+
    Console.WriteLine(dto.ToString("r")); // RFC1123形式で日時を文字列化
+
    Console.WriteLine(dto.ToString("o")); // ISO8601(W3C-DTF)形式で日時を文字列化
+
  }
+
}
+
}}
+
#tabpage(codelang=vb)
+
#code{{
+
Imports System
+

          
+
Class Sample
+
  Shared Sub Main()
+
    Dim dt As New DateTime(2013, 12, 3, 4, 5, 6)
+

          
+
    Console.WriteLine(dt.ToString("r")) ' RFC1123形式で日時を文字列化
+
    Console.WriteLine(dt.ToString("o")) ' ISO8601(W3C-DTF)形式で日時を文字列化
+
    Console.WriteLine()
+

          
+
    Dim dto As New DateTimeOffset(2013, 12, 3, 4, 5, 6, TimeSpan.FromHours(+9)) ' 日時とオフセット
+

          
+
    Console.WriteLine(dto.ToString("r")) ' RFC1123形式で日時を文字列化
+
    Console.WriteLine(dto.ToString("o")) ' ISO8601(W3C-DTF)形式で日時を文字列化
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(実行結果){{
+
Tue, 03 Dec 2013 04:05:06 GMT
+
2013-12-03T04:05:06.0000000
+

          
+
Mon, 02 Dec 2013 19:05:06 GMT
+
2013-12-03T04:05:06.0000000+09:00
+
}}
+

          
+
また逆に、&msdn(netfx,member,System.DateTime.ParseExact){ParseExactメソッド};を使うことによりこれらの形式で表記された文字列をDateTime・DateTimeOffsetに変換することができます。
+

          
+
#tabpage(codelang=cs,container-title=文字列から日時への変換)
+
#code{{
+
using System;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    string str = "2013-09-08T07:06:54.3210000-05:00"; // ISO8601形式の時刻を表す文字列
+

          
+
    DateTime dt = DateTime.ParseExact(str, "o", null);
+
    DateTimeOffset dto = DateTimeOffset.ParseExact(str, "o", null);
+

          
+
    Console.WriteLine(dt);
+
    Console.WriteLine(dto);
+
  }
+
}
+
}}
+
#tabpage(codelang=vb)
+
#code{{
+
Imports System
+
Imports System.Net
+
Imports System.Text
+

          
+
Class Sample
+
  Shared Sub Main()
+
    Dim str As String = "2013-09-08T07:06:54.3210000-05:00" ' ISO8601形式の時刻を表す文字列
+

          
+
    Dim dt As DateTime = DateTime.ParseExact(str, "o", Nothing)
+
    Dim dto As DateTimeOffset = DateTimeOffset.ParseExact(str, "o", Nothing)
+

          
+
    Console.WriteLine(dt)
+
    Console.WriteLine(dto)
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(実行結果){{
+
09/08/2013 21:06:54
+
09/08/2013 07:06:54 -05:00
+
}}
+

          
+
DateTime構造体・DateTimeOffset構造体については[[programming/netfx/datetime/0_abstract]]、日時と書式については[[programming/netfx/datetime/2_formatting_parsing]]や[[programming/netfx/string_formatting/0_formatstrings]]で詳しく解説しています。
+

          
+

          
+

          
+
*ハッシュ化 [#hash]
+
MD5, SHA-1, SHA-512などのハッシュ関数を使ってハッシュ値を求めるには、&msdn(netfx,ns,System.Security.Cryptography){System.Security.Cryptography名前空間};の&msdn(netfx,type,System.Security.Cryptography.MD5){MD5クラス};・&msdn(netfx,type,System.Security.Cryptography.SHA1){SHA1クラス};・&msdn(netfx,type,System.Security.Cryptography.SHA512){SHA512クラス};などの&msdn(netfx,type,System.Security.Cryptography.HashAlgorithm){HashAlgorithmクラス};から派生したクラスを使うことができます。
+

          
+
これらのクラスでは、&msdn(netfx,member,System.Security.Cryptography.HashAlgorithm.ComputeHash){ComputeHashメソッド};にバイト配列を指定すると、そのバイト配列のハッシュ値を取得することができます。 文字列から直接ハッシュ値を求めることはできないので、先に[[文字列をバイト配列に変換>#charset]]する必要があります。
+

          
+
以下の例ではMD5クラスを使用していますが、SHA1クラス・SHA512クラスに置き換えればSHA-1, SHA-512のハッシュ値を求めることができます。
+

          
+
#tabpage(codelang=cs,container-title=文字列からハッシュ値を求める)
+
#code{{
+
using System;
+
using System.Security.Cryptography;
+
using System.Text;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    string input = "foo";
+

          
+
    // MD5ハッシュ関数のインスタンスを作成
+
    using (MD5 hashFunc = MD5.Create()) {
+
      // 文字列をバイト配列に変換してMD5ハッシュ値を求める
+
      byte[] hash = hashFunc.ComputeHash(Encoding.UTF8.GetBytes(input));
+

          
+
      // 求めたハッシュ値を文字列化して表示
+
      string hashString = BitConverter.ToString(hash).Replace("-", string.Empty).ToLowerInvariant();
+

          
+
      Console.WriteLine("{0} {1}", input, hashString);
+
    }
+
  }
+
}
+
}}
+
#tabpage(codelang=vb)
+
#code{{
+
Imports System
+
Imports System.Security.Cryptography
+
Imports System.Text
+

          
+
Class Sample
+
  Shared Sub Main()
+
    Dim input As String = "foo"
+

          
+
    ' MD5ハッシュ関数のインスタンスを作成
+
    Using hashFunc As MD5 = MD5.Create()
+
      ' 文字列をバイト配列に変換してMD5ハッシュ値を求める
+
      Dim hash() As Byte = hashFunc.ComputeHash(Encoding.UTF8.GetBytes(input))
+

          
+
      ' 求めたハッシュ値を文字列化して表示
+
      Dim hashString As String = BitConverter.ToString(hash).Replace("-", String.Empty).ToLowerInvariant()
+

          
+
      Console.WriteLine("{0} {1}", input, hashString)
+
    End Using
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(実行結果){{
+
foo acbd18db4cc2f85cedef654fccc4a4d8
+
}}
+

          
+
Computeハッシュメソッドは引数に[[Streamクラス>programming/netfx/stream/0_abstract]]を指定することもできます。 ファイルのハッシュ値を求める場合は次のようにします。
+

          
+
#tabpage(codelang=cs,container-title=ファイルのハッシュ値を求める)
+
#code{{
+
using System;
+
using System.IO;
+
using System.Security.Cryptography;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    // ファイルsample.txtを読み込むストリームを作成する
+
    using (Stream stream = File.OpenRead("sample.txt")) {
+
      // MD5ハッシュ関数のインスタンスを作成
+
      using (MD5 hashFunc = MD5.Create()) {
+
        // ストリームの内容を読み込んでMD5ハッシュ値を求める
+
        byte[] hash = hashFunc.ComputeHash(stream);
+

          
+
        // 求めたハッシュ値を文字列化して表示
+
        string hashString = BitConverter.ToString(hash).Replace("-", string.Empty).ToLowerInvariant();
+

          
+
        Console.WriteLine(hashString);
+
      }
+
    }
+
  }
+
}
+
}}
+
#tabpage(codelang=vb)
+
#code{{
+
Imports System
+
Imports System.IO
+
Imports System.Security.Cryptography
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' ファイルsample.txtを読み込むストリームを作成する
+
    Using stream As Stream = File.OpenRead("sample.txt")
+
      ' MD5ハッシュ関数のインスタンスを作成
+
      Using hashFunc As MD5 = MD5.Create()
+
        ' ストリームの内容を読み込んでMD5ハッシュ値を求める
+
        Dim hash() As Byte = hashFunc.ComputeHash(stream)
+

          
+
        ' 求めたハッシュ値を文字列化して表示
+
        Dim hashString As String = BitConverter.ToString(hash).Replace("-", String.Empty).ToLowerInvariant()
+

          
+
        Console.WriteLine(hashString)
+
      End Using
+
    End Using
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
ハッシュ値を求める例については以下のページでも紹介しています。
+
-[[programming/netfx/tips/compute_md5sum]]
+
-[[programming/netfx/tips/cram_md5]]
+

          
+

          
+
*暗号化・復号化 [#encryption]
+
&msdn(netfx,ns,System.Security.Cryptography){System.Security.Cryptography名前空間};にあるクラスを使うことで暗号化・復号化を行うことができます。 次の例では、共通鍵方式のTriple DES(3DES)での暗号化・復号化を行う&msdn(netfx,type,System.Security.Cryptography.TripleDES){TripleDESクラス};を使い、暗号化してファイルに文字列を書き込んだあと、再度ファイルを読み込んで復号化しています。
+

          
+
#tabpage(codelang=cs,container-title=ファイルの暗号化・復号化)
+
#code{{
+
using System;
+
using System.IO;
+
using System.Security.Cryptography;
+
using System.Text;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    // TripleDESクラスがデフォルトで生成するランダムな値を取得して
+
    // 暗号化・復号化の際のキー・初期ベクタとして使用する
+
    byte[] desKey, desIV;
+

          
+
    using (TripleDES des = TripleDES.Create()) {
+
      desKey = des.Key;
+
      desIV = des.IV;
+
    }
+

          
+
    // ファイルcrypto.datに書き込むストリームを作成する
+
    using (FileStream outputStream = new FileStream("crypto.dat", FileMode.Create, FileAccess.Write)) {
+
      // TripleDESアルゴリズムのインスタンスを作成する
+
      using (TripleDES des = TripleDES.Create()) {
+
        // TripleDESアルゴリズムで暗号化した上でoutputStreamに書き込むCryptoStreamを作成する
+
        using (CryptoStream encryptStream = new CryptoStream(outputStream, des.CreateEncryptor(desKey, desIV), CryptoStreamMode.Write)) {
+
          // UTF-8にエンコードしてencryptStreamに書き込むStreamWriterを作成する
+
          using (StreamWriter writer = new StreamWriter(encryptStream, Encoding.UTF8)) {
+
            // 文字列を書き込む
+
            writer.WriteLine("かごめかごめ");
+
            writer.WriteLine("かごのなかのとりは");
+
            writer.WriteLine("いついつでやる");
+
          }
+
        }
+
      }
+
    }
+

          
+
    // ファイルcrypto.datを読み込むストリームを作成する
+
    using (FileStream inputStream = new FileStream("crypto.dat", FileMode.Open, FileAccess.Read)) {
+
      // TripleDESアルゴリズムのインスタンスを作成する
+
      using (TripleDES des = TripleDES.Create()) {
+
        // inputStreamから読み込んだ後にTripleDESアルゴリズムで復号化を行うCryptoStreamを作成する
+
        using (CryptoStream decryptStream = new CryptoStream(inputStream, des.CreateDecryptor(desKey, desIV), CryptoStreamMode.Read)) {
+
          // UTF-8でデコードしてdecryptStreamから読み込むStreamReaderを作成する
+
          using (StreamReader reader = new StreamReader(decryptStream, Encoding.UTF8)) {
+
            // ファイル全体を読み込んで表示する
+
            Console.Write(reader.ReadToEnd());
+
          }
+
        }
+
      }
+
    }
+
  }
+
}
+
}}
+
#tabpage(codelang=vb)
+
#code{{
+
Imports System
+
Imports System.IO
+
Imports System.Security.Cryptography
+
Imports System.Text
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' TripleDESクラスがデフォルトで生成するランダムな値を取得して
+
    ' 暗号化・復号化の際のキー・初期ベクタとして使用する
+
    Dim desKey(), desIV() As Byte
+

          
+
    Using des As TripleDES = TripleDES.Create()
+
      desKey = des.Key
+
      desIV = des.IV
+
    End Using
+

          
+
    ' ファイルcrypto.datに書き込むストリームを作成する
+
    Using outputStream As New FileStream("crypto.dat", FileMode.Create, FileAccess.Write)
+
      ' TripleDESアルゴリズムのインスタンスを作成する
+
      Using des As TripleDES = TripleDES.Create()
+
        ' TripleDESアルゴリズムで暗号化した上でoutputStreamに書き込むCryptoStreamを作成する
+
        Using encryptStream As New CryptoStream(outputStream, des.CreateEncryptor(desKey, desIV), CryptoStreamMode.Write)
+
          ' UTF-8にエンコードしてencryptStreamに書き込むStreamWriterを作成する
+
          Using writer As New StreamWriter(encryptStream, Encoding.UTF8)
+
            ' 文字列を書き込む
+
            writer.WriteLine("かごめかごめ")
+
            writer.WriteLine("かごのなかのとりは")
+
            writer.WriteLine("いついつでやる")
+
          End Using
+
        End Using
+
      End Using
+
    End Using
+

          
+
    ' ファイルcrypto.datを読み込むストリームを作成する
+
    Using inputStream As New FileStream("crypto.dat", FileMode.Open, FileAccess.Read)
+
      ' TripleDESアルゴリズムのインスタンスを作成する
+
      Using des As TripleDES = TripleDES.Create()
+
        ' inputStreamから読み込んだ後にTripleDESアルゴリズムで復号化を行うCryptoStreamを作成する
+
        Using decryptStream As New CryptoStream(inputStream, des.CreateDecryptor(desKey, desIV), CryptoStreamMode.Read)
+
          ' UTF-8でデコードしてdecryptStreamから読み込むStreamReaderを作成する
+
          Using reader As New StreamReader(decryptStream, Encoding.UTF8)
+
            ' ファイル全体を読み込んで表示する
+
            Console.Write(reader.ReadToEnd())
+
          End Using
+
        End Using
+
      End Using
+
    End Using
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(実行結果){{
+
かごめかごめ
+
かごのなかのとりは
+
いついつでやる
+
}}
+

          
+
上記の例では初期化ベクタ(IV)とキー(Key)の生成を省略しています。 初期ベクタとキーの生成・送受信には安全な方法をとるようにしてください。
+

          
+
ストリームを多段に重ねて使う方法については[[programming/netfx/stream/0_abstract]]、StreamWriter・StreamReaderについては[[programming/netfx/stream/2_streamreader_streamwriter]]で詳しく解説しています。
+

          
+

          
+
*圧縮・伸長 [#compression]
+
&msdn(netfx,ns,System.IO.Compression){System.IO.Compression名前空間};にあるクラスを使うことで圧縮・展開を行うことができます。 gzip形式での圧縮・伸長には&msdn(netfx,type,System.IO.Compression.GZipStream){GZipStreamクラス};、LZ77形式での圧縮・伸長には&msdn(netfx,type,System.IO.Compression.DeflateStream){DeflateStreamクラス};を使うことができます。 これらのクラスについては[[programming/netfx/fcl/System.IO.Compression.GZipStream]]で詳しく解説しています。
+

          
+

          
+

          
+

          
+

          
+