Unicode と UTF-X
えーと、なにやら某所から Unicode について解説しろとの圧力がかかったので軽く書いておく。
Unicode はなにかというと What is Unicode? にこう書いてある。
Unicode provides a unique number for every character, no matter what the platform, no matter what the program, no matter what the language.
つまり、Unicode は文字に対応する数字を定めるだけ。で、この対応する数字をコードポイントと呼ぶ。
たとえば、「odz@はてな」という文字列を Python を使って Unicode のコードポイントにしてみるとこうなる。
>>> print ' '.join('U+%04X' % ord(c) for c in u'odz@はてな') U+006F U+0064 U+007A U+0040 U+306F U+3066 U+306A
「odz@はてな」という7文字はそれぞれ、6F, 64, 7A, 40, 306F, 3066, 306A というコードポイントに割り当てられているわけだ(いずれも16進表記)。ちなみにコードポイントを表記するのには U+XXXX という表記法を使うのが一般的。
なお、US-ASCII の範囲ないでは ASCII コード と Unicode のコードポイントは一致する。
で、これらをバイト列で表現するためのエンコーディング方式が、UTF-7/UTF-8/UTF-16/UTF-32 などになる。
Python を使って同じく「odz@はてな」をこれらのエンコーディング方式でバイト列にしてみる。
>>> print ' / '.join(' '.join('%02x' % ord(c) for c in s.encode('utf-8')) for s in u'odz@はてな') 6f / 64 / 7a / 40 / e3 81 af / e3 81 a6 / e3 81 aa >>> print ' / '.join(' '.join('%02x' % ord(c) for c in s.encode('utf-16le')) for s in u'odz@はてな') 6f 00 / 64 00 / 7a 00 / 40 00 / 6f 30 / 66 30 / 6a 30 >>> print ' / '.join(' '.join('%02x' % ord(c) for c in s.encode('utf-16be')) for s in u'odz@はてな') 00 6f / 00 64 / 00 7a / 00 40 / 30 6f / 30 66 / 30 6a
どういう方式でエンコードしているかはさすがに面倒なので省略。あとは Unicode - Wikipedia あたりを見て欲しい。