Unicode と UTF-8 (とその仲間たち) のざっくりした違い


Unicode とは

文字集合のこと。ひとつひとつの文字に 符号位置 と呼ばれる整数値を付けて管理している。

UTF-8, UTF-16, UTF-32 とは

文字符号化方式 のこと。符号位置の整数値をコンピュータが使用できるようにバイト列に変換する。

エンディアンとは

複数のバイトからなるデータをメモリに記録する際やネットワークで送受信する際などに、バイトを並べる順番のこと。バイトオーダ と呼ぶこともある。ビッグエンディアンでは上位側から、リトルエンディアンでは下位側から並べる。

検証用コード

この記事を書くにあたって Python で検証したときのコードです。

In [1]: import unicodedata

In [2]: import binascii

In [3]: unicodedata.name('鬱') # 名前を調べる
Out[3]: 'CJK UNIFIED IDEOGRAPH-9B31'

In [4]: ord('鬱') # 符号位置を調べる
Out[4]: 39729

In [5]: binascii.hexlify('鬱'.encode('UTF-8')) # UTF-8 でバイト列にエンコードしてから 16 進数表現に変換する
Out[5]: b'e9acb1'

In [6]: binascii.hexlify('鬱'.encode('UTF-16'))
Out[6]: b'fffe319b'

In [7]: binascii.hexlify('鬱'.encode('UTF-16LE'))
Out[7]: b'319b'

In [8]: binascii.hexlify('鬱'.encode('UTF-16BE'))
Out[8]: b'9b31'

In [9]: binascii.hexlify('鬱'.encode('UTF-32'))
Out[9]: b'fffe0000319b0000'

In [10]: binascii.hexlify('鬱'.encode('UTF-32LE'))
Out[10]: b'319b0000'

In [11]: binascii.hexlify('鬱'.encode('UTF-32BE'))
Out[11]: b'00009b31'

In [12]: binascii.hexlify('快感'.encode('UTF-16'))
Out[12]: b'fffeeb5f1f61'

In [13]: binascii.hexlify('快感'.encode('UTF-16LE'))
Out[13]: b'eb5f1f61'

In [14]: binascii.hexlify('快感'.encode('UTF-16BE'))
Out[14]: b'5feb611f'