2003-11-03

文字コードについて
PCというものが世の中に登場して来たとき(8ビットCPUだった)には、
半角文字しか扱うことができなく、日本製のPCは、この頃から厄介な
半角カタカナというものもあった。

当時のPCでは、ワープロのソフトもなく、ワープロ(という装置)は
机の形をしていた機械だった。

今では、意識することなくPCで日本語を扱うことができるようになったが、
それでも、気をつけていないと、漢字が化けるなどの問題がある。


メモ帳で色々な文字コードを保存

Windows2000のメモ帳を使い下記の4種類の文字コードを試してみた。
 ANSI
 Unicode
 Unicode big endian
 UTF-8
メモ帳でそれぞれの文字コードで保存してテキストファイルを作成する。
ファイルの内容は「abcあいう」という文字列が書いてあり、
そのファイルをHEXダンプした。


ANSIの場合

61 62 63 82 A0 82 A2 82 A4 0D 0A

先頭の3バイトは「abc」の単純なASCIIコードだった。
4バイト目からの82A0は「あ」というシフトJISコードで、
改行コードは0D0Aとなっている。


Unicodeの場合

FF FE 61 00 62 00 63 00 42 30 44 30 46 30 0D 00 0A 00

先頭の2バイトのFFFEはBOM(Byte Order Mark)というものだ。
Unicodeの「a」はで0061なのだが、HEXダンプをみると、
(3バイト目から)6100となっていて下位8ビット、上位8ビットの順番で
リトルエンディアンになっている。
ちなみに、「あ」はUnicodeで3042で、改行コードは0D 00 0A 00となっている。
メモ帳で「Unicode」を指定して保存するとリトルエンディアンになるようだ。


Unicode big endianの場合

FE FF 00 61 00 62 00 63 30 42 30 44 30 46 00 0D 00 0A

先頭の2バイトはFEFFでBOMになっている。
「a」はUnicodeで0061だから、3バイト目からも0061なので、
ビッグエンディアンになっている。


UTF-8の場合

EF BB BF 61 62 63 E3 81 82 E3 81 84 E3 81 86 0D 0A

先頭から3バイトはEFBBBFとなっている。これをビット列にすると。
「1110 1111 1011 1011 1011 1111」となる。
UTF-8なので先頭の「1110」は3バイト文字の意味で有効なビットだけ見ると、
「.... 1111 ..11 1011 ..11 1111」となりFEFFで、これはBOMだ。
UTF-8の場合、BOMは入れないことになっているが、
メモ帳は先頭の3バイトにBOMを埋め込んでいるようだ。

4バイト目からの61 62 63はASCIIの「abc」で、
7バイト目からのE3 81 82をビット列にすると、
「1110 0011 1000 0001 1000 0010」で、3042となり「あ」のコードとなる。


UCS−2とUTF-8

UCS-2(Universal Character Set coded in 2 octets)は2バイトのUnicodeのデータの事。
ASCIIの「a」と言う文字は00 41の2バイトで、「U+0041」と表記する。

UTFとは「Unicode Transformation Format, 8-bit encoding form」の略でASCIIとの
互換性を保つために作られたようだ。
ASCIIは1バイトで表し、漢字コードなどは3バイトで表す。


UCS-2からUTF-8の変換表
UCS-2 ビット列 第1バイト 第2バイト 第3バイト
U+0000...U+007F 00000000-0xxxxxxx 0xxxxxxx なし なし
U+0080...U+07FF 00000xxx-xxyyyyyy 110xxxxx 10yyyyyy なし
U+0800...U+FFFF xxxxyyyy-yyzzzzzz 1110xxxx 10yyyyyy 10zzzzzz
例として、上記の表から、「あ」と言う文字を変換する。 Unicodeで「あ」はU+3042でこれをビット列にすると、 「0011 0000 0100 0010」 となり、表を参考にしてxyzに分けると 「xxxx=0011、yyyyyy=000001、zzzzzz=000010」 バイト単位に組み立てる。  第1バイト= 1110 0011 HEX表記でE3  第2バイト= 1000 0001 HEX表記で81  第3バイト= 1000 0010 HEX表記で82  UTF-8で「あ」の文字コードはE3 81 82となる。
戻る