■ Encoding クラス ■ 文字エンコーディングを表す。 名 前 空 間:System.Text アセンブリ:mscorlib (mscorlib.dll 内) ■ 解説 エンコーディングは、Unicode 文字のセットをバイトシーケンスに変換するプロセスで有る。デコードは、其の 逆に成る。エンコードされたバイトシーケンスをUnicode 文字のセットに変換するプロセスで有る。 Unicode Standard では、サポートされる総てのスクリプトに付いて、各文字にコードポイント(数値)を割り 当てゝ居る。コードポイントのエンコードにはUTF(Unicode Transformation Format)が使用される。Unicode Standard バージョン 3.2 では、次の UTF が使用されて居る。
・UTF-8 (各コードポイントが、1 バイトから 4 バイトのシーケンスと仕て表現される) ・UTF-16 (各コードポイントが、1 つか 2 つの 16 ビット整数のシーケンスと仕て表現される) ・UTF-32 (各コードポイントが 32 ビット整数と仕て表現される)
.NET Framework では、現在の Unicode エンコーディング、及び、他のエンコーディングをサポートする為、 下記の様なEncoding クラスを実装して居る。
・ASCIIEncoding は、Unicode 文字を 1 個の 7 ビット ASCII 文字と仕てエンコードする。此のエンコーディン グは、U+0000 から U+007F 迄の文字値丈をサポートする。コードページは 20127 で有る。ASCII プロパテ ィを通じても使用出来る。
・UTF7Encoding は、UTF-7 エンコーディングを使用して Unicode 文字をエンコードする。此のエンコーディ ングは、総てのUnicode 文字値をサポートして居る。コードページは 65000 で有る。UTF7 プロパティを通 じても使用出来る。
・UTF8Encoding は、UTF-8 エンコーディングを使用して Unicode 文字をエンコードする。此のエンコーディ ングは、総てのUnicode 文字値をサポートして居る。コードページは 65001 で有る。UTF8 プロパティを通 じて使用出来る。
・UnicodeEncoding は、UTF-16 エンコーディングを使用して Unicode 文字をエンコードする。リトルエンデ ィアン(コードページ1200)とビッグエンディアン(コードページ 1201)の両方のバイト順をサポートして 居る。Unicode プロパティ、及び、BigEndianUnicode プロパティを通じても使用出来る。
・UTF32Encoding は、UTF-32 エンコーディングを使用して Unicode 文字をエンコードする。リトルエンディ アン(コードページ65005)とビッグエンディアン(コードページ 65006)の両方のバイト順をサポートして 居る。UTF32 プロパティを通じても使用出来る。 其の他のエンコーディングを取得するには、GetEncoding メソッドを使用する。エンコーディングの一覧を取得 するには、GetEncodings メソッドを使用する。 次の表は、エンコーディングと、其れに関連付けられたコードページの一覧を示して居る。最後の列にアスタリ スク( * )が付いて居るコードページは、基に成るプラットフォームに関係無く、.NET Framework でネイテ ィブにサポートされて居る。
コードページ 名前 表示名 932 shift_jis 日本語(シフトJIS) 1200 utf-16 Unicode 1201 unicodeFFFE Unicode(Big-Endian) 10001 x-mac-japanese 日本語(Mac) 20932 EUC-JP 日本語(JIS 0208-1990 及び 0212-1990) 50220 iso-2022-jp 日本語(JIS) 50221 csISO2022JP 日本語(JIS 1 バイト カタカナ可)
50222 iso-2022-jp 日本語(JIS 1 バイト カタカナ可 - SO/SI)
51932 euc-jp 日本語(EUC) 65000 utf-7 Unicode(UTF-7) 65001 utf-8 Unicode(UTF-8) 65005 utf-32 Unicode(UTF-32) 65006 utf-32BE Unicode(UTF-32 ビッグエンディアン) GetByteCount メソッドは、Unicode 文字のセットをエンコードした結果、得られるバイト数を確認する。実際 のエンコードは、GetBytes メソッドに依って実行される。 【此処から】 同様に、GetCharCount メソッドは、バイトシーケンスをデコードした結果得られる文字数を確認する。実際の デコードは GetChars メソッドに依って実行される。 変換するデータが一連のブロックの形でのみ得られる場合 (ストリームから読み込むデータなど)、又は、データ 容量が大きい為に小さなブロックに分割する必要がある場合は、派生クラスの GetDecoder メソッドで得られる Decoder、又は GetEncoder メソッドで得られる Encoder を使用する。
UTF-16 エンコーダ及び UTF-32 エンコーダでは、最上位バイトが先頭に配置されるビッグ エンディアン バ イト順、又は最下位バイトが先頭に配置されるリトル エンディアン バイト順が使用される。たとえば、アルフ ァベットの大文字 A (U+0041) は次の様に 16 進数でシリアル化される。 ・UTF-16 ビッグ エンディアン バイト順 : 00 41 ・UTF-16 リトル エンディアン バイト順 : 41 00 ・UTF-32 ビッグ エンディアン バイト順 : 00 00 00 41 ・UTF-32 リトル エンディアン バイト順 : 41 00 00 00 Encoding は、オプションでプリアンブルを提供する。プリアンブルは、エンコーディング プロセスで得られた バイトシーケンスの先頭に付加できるバイトの配列で有る。プリアンブルにバイト順マーク (Unicode では、コ ードポイント U+FEFF) が含まれる場合、デコーダはバイト順及び変換形式 (UTF) を判断出来る。Unicode バ イト順マークは、次の様に 16 進数でシリアル化される。 ・UTF-8 : EF BB BF ・UTF-16 ビッグ エンディアン バイト順 : FE FF ・UTF-16 リトル エンディアン バイト順 : FF FE ・UTF-32 ビッグ エンディアン バイト順 : 00 00 FE FF ・UTF-32 リトル エンディアン バイト順 : FF FE 00 00 通常、ネイティブなバイト順で Unicode 文字を格納した方が効率的で有る。たとえば、Intel のコンピュータな ど、リトル エンディアンのプラットフォームでは、リトル エンディアンのバイト順を使用した方が効率的で有
る。
GetPreamble メソッドは、バイト順マークを格納できるバイト配列を返します。此のバイト配列がエンコード 済みストリームの前に付加されて居ると、使用されて居るエンコーディング形式をデコーダが識別するのに役立 ちます。
バイト順とバイト順マークの詳細に付いては、www.unicode.org の「Unicode Standard」を参照してください。 ■ 使用例 次のコード例は、あるエンコーディングから別のエンコーディングへ文字列を変換して居る。 Visual Basic Imports System Imports System.Text Imports Microsoft.VisualBasic Namespace Convert_Example Class MyConvertExampleClass Shared Sub Main()
Dim unicodeString As String = "This string contains the unicode character Pi(" & ChrW(&H03A0) & ")"
' Create two different encodings.
Dim ascii As Encoding = Encoding.ASCII Dim [unicode] As Encoding = Encoding.Unicode ' Convert the string into a byte[].
Dim unicodeBytes As Byte() = [unicode].GetBytes(unicodeString) ' Perform the conversion from one encoding to the other.
Dim asciiBytes As Byte() = Encoding.Convert([unicode], ascii, unicodeBytes) ' Convert the new byte[] into a char[] and then into a string.
' This is a slightly different approach to converting to illustrate ' the use of GetCharCount/GetChars.
Dim asciiChars(ascii.GetCharCount(asciiBytes, 0, asciiBytes.Length)) As Char ascii.GetChars(asciiBytes, 0, asciiBytes.Length, asciiChars, 0)
Dim asciiString As New String(asciiChars)
' Display the strings created before and after the conversion. Console.WriteLine("Original string: {0}", unicodeString) Console.WriteLine("Ascii converted string: {0}", asciiString) End Sub
End Class End Namespace
using System; using System.Text; namespace ConvertExample { class ConvertExampleClass {
static void Main() {
string unicodeString = "This string contains the unicode character Pi(¥u03a0)"; // Create two different encodings.
Encoding ascii = Encoding.ASCII; Encoding unicode = Encoding.Unicode; // Convert the string into a byte[].
byte[] unicodeBytes = unicode.GetBytes(unicodeString); // Perform the conversion from one encoding to the other.
byte[] asciiBytes = Encoding.Convert(unicode, ascii, unicodeBytes);
// Convert the new byte[] into a char[] and then into a string. // This is a slightly different approach to converting to illustrate // the use of GetCharCount/GetChars.
char[] asciiChars = new char[ascii.GetCharCount(asciiBytes, 0, asciiBytes.Length)]; ascii.GetChars(asciiBytes, 0, asciiBytes.Length, asciiChars, 0);
string asciiString = new string(asciiChars);
// Display the strings created before and after the conversion. Console.WriteLine("Original string: {0}", unicodeString); Console.WriteLine("Ascii converted string: {0}", asciiString); }
} }
C++ using namespace System;
using namespace System::Text; int main()
{
String^ unicodeString = "This string contains the unicode character Pi(¥u03a0)";
// Create two different encodings. Encoding^ ascii = Encoding::ASCII; Encoding^ unicode = Encoding::Unicode;
// Convert the string into a Byte->Item[].
// Perform the conversion from one encoding to the other.
array<Byte>^asciiBytes = Encoding::Convert( unicode, ascii, unicodeBytes );
// Convert the new Byte into[] a char and[] then into a string. // This is a slightly different approach to converting to illustrate // the use of GetCharCount/GetChars.
array<Char>^asciiChars = gcnew array<Char>(ascii->GetCharCount( asciiBytes, 0, asciiBytes->Length ));
ascii->GetChars( asciiBytes, 0, asciiBytes->Length, asciiChars, 0 ); String^ asciiString = gcnew String( asciiChars );
// Display the strings created before and after the conversion. Console::WriteLine( "Original String*: {0}", unicodeString ); Console::WriteLine( "Ascii converted String*: {0}", asciiString ); } ■ Encoding メンバ パブリック プロパティ 名前 説明 ASCII ASCII(7 ビット)文字セットのエンコーディングを取得する。 BigEndianUnicode ビッグエンディアンバイト順を使用する UTF-16 形式のエンコーディングを取得する。 BodyName 派生クラスでオーバーライドされた場合、メールエージェントのBody タグと共に使用 出来る現在のエンコーディングの名前を取得する。 CodePage 派生クラスでオーバーライドされた場合、現在の Encoding のコードページ ID を取 得する。
DecoderFallback 現在の Encoding オブジェクトの DecoderFallback オブジェクトを取得又は設定す る。
Default システムの現在の ANSI コードページのエンコーディングを取得する。
EncoderFallback 現在の Encoding オブジェクトの EncoderFallback オブジェクトを取得又は設定す る。 EncodingName 派生クラスでオーバーライドされた場合、現在のエンコーディングに付いての記述を、 ユーザーが判読出来る形式で取得する。 HeaderName 派生クラスでオーバーライドされた場合、メール エージェント ヘッダー タグと共に 使用出来る現在のエンコーディングの名前を取得する。 IsBrowserDisplay 派生クラスでオーバーライドされた場合、ブラウザ クライアントが現在のエンコーデ ィングを使用してコンテンツを表示出来るかどうかを示す値を取得する。 IsBrowserSave 派生クラスでオーバーライドされた場合、ブラウザ クライアントが現在のエンコーデ ィングを使用してコンテンツを保存出来るかどうかを示す値を取得する。 IsMailNewsDisplay 派生クラスでオーバーライドされた場合、メール クライアント及びニュース クライア ントが現在のエンコーディングを使用してコンテンツを表示出来るかどうかを示す値 を取得する。 IsMailNewsSave 派生クラスでオーバーライドされた場合、メール クライアント及びニュース クライア ントが現在のエンコーディングを使用してコンテンツを保存出来るかどうかを示す値 を取得する。
IsReadOnly 派生クラスでオーバーライドされた場合、現在のエンコーディングが読み取り専用かど うかを示す値を取得する。 IsSingleByte 派生クラスでオーバーライドされた場合、現在のエンコーディングが 1 バイトのコー ドポイントを使用するかどうかを示す値を取得する。 Unicode リトル エンディアン バイト順を使用する UTF-16 形式のエンコーディングを取得す る。 UTF32 リトル エンディアン バイト順を使用する UTF-32 形式のエンコーディングを取得す る。 UTF7 UTF-7 形式のエンコーディングを取得する。 UTF8 UTF-8 形式のエンコーディングを取得する。
WebName 派生クラスでオーバーライドされた場合、現在のエンコーディングの IANA (Internet Assigned Numbers Authority) に登録されて居る名前を取得する。
WindowsCodePage 派生クラスでオーバーライドされた場合、現在のエンコーディングに最も厳密に対応す る Windows オペレーティング システムのコードページを取得する。
パブリックメソッド
名前 説明
Finalize Object がガベージ コレクションにより収集される前に、其の Object がリソースを解 放し、其の他のクリーンアップ操作を実行出来る様にする。 (Object から継承される。) MemberwiseClone 現在の Object の簡易コピーを作成する。 (Object から継承される。)
■ 基本型のエンコーディング
文字は、多数の異なる文字スキーム又はコードページを使用して表現出来る抽象エンティティで有る。たとえば、 Unicode UTF-16 エンコーディングでは文字が 16 ビット整数のシーケンスと仕て表されるが、Unicode UTF-8 では同じ文字が 8 ビット バイトのシーケンスと仕て表される。共通言語ランタイムは、Unicode UTF-16 (Unicode Transformation Format、16 ビット エンコーディング形式) を使用して文字を表する。
共通言語ランタイムをターゲットとするアプリケーションは、エンコーディングに依って文字表現をネイティブ の文字スキームから別のスキームに変換する。これらのアプリケーションは、デコーディングに依って非ネイテ ィブ スキームの文字をネイティブ スキームに割り当てます。文字をエンコード及びデコードする為に最も一般 的に使用される System.Text 名前空間のクラスを次の表に示します。 文字スキーム クラス 説明 ASCII エンコー ディング System.Text.ASCIIEncoding ASCII 文字の変換を行います。 各種エンコーディ ング System.Text.Encoding Convert メソッドに指定されたさまざまなエンコーデ ィングの文字変換を行います。 UTF-16 Unicode エンコーディング System.Text.UnicodeEncoding UTF-16 エンコーディングの変換を行います。此のスキ ームでは、文字が 16 ビット整数で表される。 UTF-8 Unicodeエ ンコーディング System.Text.UTF8Encoding UTF-8 エンコーディングの変換を行います。此の可変幅 エンコーディング スキームでは、文字が 1 ~ 4 バイト で表される。 ASCIIEncoding.GetBytes メソッドを使用して、Unicode 文字列をバイト配列に変換するコード例を次に示しま す。配列内の各バイトは、文字列の其の位置にある文字に対応する ASCII 値を表します。
Visual Basic Dim MyString As String = "Encoding String."
Dim AE As New ASCIIEncoding()
Dim ByteArray As Byte() = AE.GetBytes(MyString) Dim x as Integer
For x = 0 To ByteArray.Length - 1 Console.Write("{0} ", ByteArray(x)) Next
C# string MyString = "Encoding String.";
ASCIIEncoding AE = new ASCIIEncoding(); byte[] ByteArray = AE.GetBytes(MyString); for(int x = 0;x <= ByteArray.Length - 1; x++) { Console.Write("{0} ", ByteArray[x]); } 此の例では、次の値がコンソールに表示される。バイト 69 は文字 E の ASCII 値で有る。バイト 110 は文字 n の ASCII 値であり、以下同様に続いて居る。 69 110 99 111 100 105 110 103 32 83 116 114 105 110 103 46 ASCIIEncoding クラスを使用して、上のバイト配列を文字配列に変換するコード例を次に示します。GetChars メソッドを使用して、バイト配列をデコードする。 Visual Basic Dim AE As New ASCIIEncoding()
Dim ByteArray As Byte() = { 69, 110, 99, 111, 100, 105, 110, 103, 32, 83, 116, 114, 105, 110, 103, 46 } Dim CharArray As Char() = AE.GetChars(ByteArray)
Dim x As Integer
For x = 0 To CharArray.Length - 1 Console.Write(CharArray(x)) Next
C# ASCIIEncoding AE = new ASCIIEncoding();
byte[] ByteArray = { 69, 110, 99, 111, 100, 105, 110, 103, 32, 83, 116, 114, 105, 110, 103, 46 }; char[] CharArray = AE.GetChars(ByteArray);
for(int x = 0;x <= CharArray.Length - 1; x++) {
Console.Write(CharArray[x]); }