連載
» 2008年07月24日 05時00分 UPDATE

.NET TIPS:Encodingクラスで扱えるエンコーディング名は?[C#、VB]

[遠藤孝信,デジタルアドバンテージ]
.NET TIPS
Insider.NET


「.NET TIPS」のインデックス

連載目次

 「TIPS:文字列をシフトJISとしてバイト列に変換するには?」や「TIPS:バイト列を文字列に変換するには?」では、文字列のエンコーディングとしてシフトJISを使用するために、シフトJISをサポートしているEncodingクラス(System.Text名前空間)のインスタンスを次のようにして取得している。

Encoding sjisEnc = Encoding.GetEncoding("Shift_JIS");

Dim sjisEnc As Encoding = Encoding.GetEncoding("Shift_JIS")

Encodingクラス(System.Text名前空間)のインスタンス作成(上:C#、下:VB)

 この場合では、引数として、シフトJISの文字コード体系(キャラクタ・セット)を表す値を文字列「Shift_JIS」で指定している。シフトJIS以外では、日本語のエンコーディングによく使用されるキャラクタ・セットとして、次のようなものが指定できる。

  • EUC-JP
  • iso-2022-jp

 後者のiso-2022-jpは、いわゆる「JISコード」と呼ばれるものだ。しかし、MSDNのEncoding.GetEncodingの項には、これらの値は列挙されていない。GetEncodingメソッドのパラメータとしては、ほかにどのようなキャラクタ・セットが指定できるのだろうか?

GetEncodingメソッドによるキャラクタ・セットの列挙

 GetEncodingメソッドの引数に、文字列として指定可能なキャラクタ・セットの名前は、IANA(Internet Assigned Numbers Authority)で登録されているキャラクタ・セットの名称が採用されている(ただし、そこで定義されたすべてのキャラクタ・セットを使用できるわけではない)

 また、GetEncodingメソッドの引数には、キャラクタ・セットの名前ではなく、それに対応したコード・ページの値を指定することもできる。例えば、シフトJISに対応したコード・ページ値は「932」なので、上のコードは次のように記述しても同等だ。

Encoding sjisEnc = Encoding.GetEncoding(932);

Dim sjisEnc As Encoding = Encoding.GetEncoding(932)

Encoding.GetEncoding("Shift_JIS")と同等の記述(上:C#、下:VB)

 MSDNにもあるように、GetEncodingメソッドの引数として指定できるコード・ページ値は、0以上65535未満の整数値である。そしてEncodingクラスでは、WebNameプロパティにより、IANAで登録されているエンコーディングの名前を取得することができる。また、EncodingNameプロパティにより、「ユーザーが判別できる形」で、エンコーディングの名前を取得することができる。

 よって、すべてのコード・ページ値についてEncodingオブジェクトを作成し、上述のプロパティを表示させれば、システムで使用可能なすべてのエンコーディングを列挙できる。このプログラムは次のようになる(実装されていないコード・ページ値を指定してGetEncodingメソッドを呼び出せば例外が発生するが、これは無視している)。

// enumenc.cs

using System;
using System.Text;

class EnumerateEncoding {
  public static void Main() {

    for (int i = 0; i < 65535; i++) {
      try {
        Encoding enc = Encoding.GetEncoding(i);
        Console.Write(i);
        Console.Write(", " + enc.WebName);
        Console.Write(", " + enc.EncodingName);
        Console.WriteLine();
      } catch {}
    }
  }
}
// コンパイル方法:csc enumenc.cs

利用可能なコード・ページ値とキャラクタ・セット名を列挙するC#のサンプル・プログラム(enumenc.cs)
enumenc.csのダウンロード

' enumenc.vb

Imports System
Imports System.Text

Class EnumerateEncoding
  Shared Sub Main()


    For i As Integer = 1 To 65535
      Try
        Dim enc As Encoding = Encoding.GetEncoding(i)
        Console.Write(i)
        Console.Write(", " + enc.WebName)
        Console.Write(", " + enc.EncodingName)
        Console.WriteLine()
      Catch
      End Try
    Next
  End Sub
End Class

' コンパイル方法:vbc enumenc.vb

利用可能なコード・ページ値とキャラクタ・セット名を列挙するVBのサンプル・プログラム(enumenc.vb)
enumenc.vbのダウンロード

 筆者の日本語版Windows XP環境でこのサンプル・プログラムを実行した結果を表にまとめると次のようになった。

コード・ページ値 WebNameプロパティ EncodingNameプロパティ
0 shift_jis 日本語 (シフト JIS)
37 IBM037 IBM EBCDIC (米国 - カナダ)
437 IBM437 OEM 米国
500 IBM500 IBM EBCDIC (インターナショナル)
737 ibm737 ギリシャ語 (DOS)
775 ibm775 バルト言語 (DOS)
850 ibm850 西ヨーロッパ語 (DOS)
852 ibm852 中央ヨーロッパ言語 (DOS)
855 IBM855 OEM キリル語
857 ibm857 トルコ語 (DOS)
860 IBM860 ポルトガル語 (DOS)
861 ibm861 アイスランド語 (DOS)
863 IBM863 フランス語 (カナダ)(DOS)
865 IBM865 ノルウェー語 (DOS)
866 cp866 キリル語 (DOS)
869 ibm869 ギリシャ語 モダン (DOS)
874 windows-874 タイ語 (Windows)
875 cp875 IBM EBCDIC (ギリシャ語 モダン)
932 shift_jis 日本語 (シフト JIS)
936 gb2312 簡体字中国語 (GB2312)
949 ks_c_5601-1987 韓国語
950 big5 繁体字中国語 (Big5)
1026 IBM1026 IBM EBCDIC (トルコ語 Latin-5)
1200 utf-16 Unicode
1201 unicodeFFFE Unicode (Big-Endian)
1250 windows-1250 中央ヨーロッパ言語 (Windows)
1251 windows-1251 キリル語 (Windows)
1252 Windows-1252 西ヨーロッパ言語 (Windows)
1253 windows-1253 ギリシャ語 (Windows)
1254 windows-1254 トルコ語 (Windows)
1255 windows-1255 ヘブライ語 (Windows)
1256 windows-1256 アラビア語 (Windows)
1257 windows-1257 バルト語 (Windows)
1258 windows-1258 ベトナム語 (Windows)
1361 Johab 韓国語 (Johab)
10000 macintosh 西ヨーロッパ言語 (Mac)
10001 x-mac-japanese 日本語 (Mac)
10002 x-mac-chinesetrad 繁体字中国語 (Mac)
10003 x-mac-korean 韓国語 (Mac)
10006 x-mac-greek ギリシャ語 (Mac)
10007 x-mac-cyrillic キリル語 (Mac)
10008 x-mac-chinesesimp 簡体字中国語 (Mac)
10010 x-mac-romanian ルーマニア語 (Mac)
10017 x-mac-ukrainian ウクライナ語 (Mac)
10029 x-mac-ce 中央ヨーロッパ語 (Mac)
10079 x-mac-icelandic アイスランド語 (Mac)
10081 x-mac-turkish トルコ語 (Mac)
10082 x-mac-croatian クロアチア語 (Mac)
20000 x-Chinese-CNS 繁体字中国語 (CNS)
20127 us-ascii US-ASCII
20261 x-cp20261 T.61
20290 IBM290 IBM EBCDIC (日本語カタカナ)
20866 koi8-r キリル語 (KOI8-R)
20932 EUC-JP 日本語 (JIS 0208-1990 and 0212-1990)
20936 x-cp20936 簡体字中国語 (GB2312-80)
20949 x-cp20949 韓国語 Wansung
21027 x-cp21027 Ext Alpha Lowercase
21866 koi8-u キリル語 (KOI8-R)
28591 iso-8859-1 西ヨーロッパ言語 (ISO)
28592 iso-8859-2 中央ヨーロッパ言語 (ISO)
28594 iso-8859-4 バルト語 (ISO)
28595 iso-8859-5 キリル語 (ISO)
28597 iso-8859-7 ギリシャ語 (ISO)
28599 iso-8859-9 トルコ語 (ISO)
28603 iso-8859-13 エストニア語 (ISO)
28605 iso-8859-15 ラテン語 9 (ISO)
50220 iso-2022-jp 日本語 (JIS)
50221 csISO2022JP 日本語 (JIS-Allow 1 byte Kana)
50222 iso-2022-jp 日本語 (JIS-Allow 1 byte Kana - SO/SI)
50225 iso-2022-kr 韓国語 (ISO)
50227 x-cp50227 簡体字中国語 (ISO-2022)
51932 euc-jp 日本語 (EUC)
51936 EUC-CN 簡体字中国語 (EUC)
51949 euc-kr 韓国語 (EUC)
52936 hz-gb-2312 簡体字中国語 (HZ)
54936 GB18030 簡体字中国語 (GB18030)
65000 utf-7 Unicode (UTF-7)
65001 utf-8 Unicode (UTF-8)

 この表のうち、WebNameプロパティとして取得された文字列が、GetEncodingメソッドのパラメータで文字列として指定可能な値だ(文字の大文字/小文字は区別されない)。

 なお、コード・ページ値が0の場合も「shift_jis」となっているが、これはシステムのデフォルトのエンコーディングであり、Encoding.Defaultプロパティによって得られるEncodingオブジェクトと同じものとなる。

 また、us-ascii(20127)やutf-8(65001)などの一般的なものについては、わざわざGetEncodingメソッドを呼ばなくても、Encoding.ASCIIプロパティやEncoding.UTF8プロパティなどのstaticなプロパティからEncodingオブジェクトを得ることができるようになっている。

 実際には、GetEncodingメソッドのパラメータで指定可能な文字列の元となるデータは、レジストリの次のキー配下で定義されているようだ。

HKEY_CLASSES_ROOT\MIME\Database\Charset



 ここでは、キャラクタ・セット名に加えて、その別名(Alias)も定義されている。例えば、「Shift_JIS」の別名としては、次のようなものがある。

  • csShiftJIS
  • csWindows31J
  • ms_Kanji
  • shift-jis
  • x-ms-cp932
  • x-sjis

 これらの文字列はどれも、「Shift_JIS」の代わりにGetEncodingメソッドの引数として指定できる。

カテゴリ:クラス・ライブラリ 処理対象:文字列
使用ライブラリ:Encodingクラス(System.Text名前空間)
関連TIPS:文字列の長さを取得するには?
関連TIPS:文字列をシフトJISとしてバイト列に変換するには?
関連TIPS:バイト列を文字列に変換するには?


■更新履歴

【2008/07/24】VB(Visual Basic)のコード例とサンプル・プログラムを追加しました。

【2003/04/11】初版公開。


「.NET TIPS」のインデックス

.NET TIPS

Copyright© 1999-2017 Digital Advantage Corp. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。