Unicode入門 | |
|
メモ帳とUnicode
『メモ帳』に何か書き込み、「名前を付けて保存(A)」をプルダウンメニューから選択すると
保存ダイアログボックスが出てくる、このダイアログボックスの一番下の文字コードの 選択ボタンを押してみると、 「ANSI」 「Unicode」 「Unicode big endian」 「UTF-8」 の4つの選択コンボボックスが開く。 この4つの違いについて調べてみよう。 先ず「abcABC」の6文字を『メモ帳』に書き込みこれを4つのモードで保存して、 保存したデータをバイト配列に読み込んで、読み込んだ順番にバイト配列を表示してみる。 ここで使用したコードはC#、VB.NETの両方のコードで下に表示しているので参考にしていただきたい。 ここでの「「ABC」は大文字のABCでは無く、いわゆる大文字の2バイト文字のABCで有る。
「ANSI」
「ANSI」で保存したデータは
61-62-63-82-60-82-61-82-62 と保存されている。 基本的にANSIはいわゆるアルファベットと数字、記号であり、この保存方法はShift-Jisであろう。 Shift-Jis(code page 932)はANSIコードに2バイトの漢字コードを加えた物で、アルファベット等の256文字は ANSIと同じである。 61は16進法で表された「a」のアスキーコードである「-」は単なる表示上の区切りマークで書き込まれている訳ではない。 数字の61はc言語では「0x61」VBでは「&H61」となり、10進法では97となる。 82-60は「A」、82-61は「B」、82-62は「C」である。 ちなみにWindows 95はShift-Jisが標準で使われていました。
「Unicode」
FF-FE-61-00-62-00-63-00-21-FF-22-FF-23-FF
と保存されている、「FF-FE」は『BOM』と呼ばれるヘッダーである。 『メモ帳』のUnicodeと呼ばれる物は『UTF-16』でBMP (基本多言語面)を16ビット、 その他をサロゲートペアという仕組みを使い32ビットで指定する方式である。 WindowsXp以降のOSはこの方式が使われている。 「a」は「61-00」と2バイトで記録されている。 「A」は「21-FF」、「B」は「22-FF」、「C」は「23-FF」と記録される。 「61-00」と「00」が先に来ているのは『リトル・エンディアン』と呼ばれるデータをメモリー上に配置する 方式で、低い桁が先に配置される、PCは主にこの方法で配置される。 この反対に「00-61」と大きい桁から配置される方法も有る。 この方法が3番目の「Unicode big endian」である。
「Unicode big endian」
FE-FF-00-61-00-62-00-63-FF-21-FF-22-FF-23
と保存されている。 頭の2倍とのBOMを見ると、「FF-FE」、「FE,FF」と区別されていることがわかる。
「UTF-8」
最後の「UTF-8」であるが、これもUnicodeと呼ばれるので注意されたい。
これは、 EF-BB-BF-61-62-63-EF-BC-A1-EF-BC-A2-EF-BC-A3 となっている。 「EF-BB-BF」がBOMである、UTFの場合はANSIの上位互換であり、 ANSIの場合は256文字を1バイトで表すが、UTF-8の場合はこれに加えて 漢字などは3バイトで保存される。 「abc」は「61-62-63」とANSIと同じであるが、 「A」は「EF-BC-A1」、「B」は「EF-BC-A2」、「C」は「EF-BC-A3」と3バイトで記録される。 インターネットではこの形式が一般的であり、IEなどの設定でUnicodeといえばUTF-8である。 FraneworkのStreamは何も指定しなければ、UTF-8で文字を吐き出しので注意が必要で有る。 これは漢字3バイト、英数字1バイトと言う英語圏優位の方式である。(?)
使用したコード
C#、VB.NETともに、フォームに textBox1(TextBox1)とbutton1(Button1)を貼り付ける。
更にopenFileDialog1(OpenFileDialog1)を貼り付ける。 テキストボックスのMulutilineをTrueにしておく。 なおファイルの読み書きにはusing(Using)を使用すべきところであるが、コードを見やすくする為と usingに慣れていない人の為に本コードではusingを使用していないので了解されたし。
C#のコード
VB.NETのコード
Option Strict On |