小池啓仁 ヒロヒト応援ブログ By はてな

小池啓仁(コイケヒロヒト)の動画など。

小池啓仁 ヒロヒト応援ブログ By はてな

Unicodeの概略を理解する

本来、UnicodeのUniは一つを表すことなのに、複数Unicodeがあるみたいですね。
また、最近のPerlではutf8とか、VB2005では内部コードにUnicodeを採用しているとか…。
ということで、Unicodeがよくわからないので、今回、調べてみました。

Unicodeとは

まず、ユニコード(Unicode)はUCS-2(Universal Character Set coded in 2 octets)と称されています。
基本的に世界の文字を2バイト(16ビット)で表現しようとしている(現在では、21ビットの文字集合として規定されている)。
しかし、コードは一つですが、文字符号化方式により、UTF-16,UTF-8,UTF-7,UTF-32等の約4種類があるのです。
そう、あくまでもUnicodeは一つなのです。複数Unicodeがあるわけではなく、複数文字符号化方式があるのです。

UTFとは

文字符号化方式(UTF)とは、UCS-2として定義されたコード文字をビット列としてどのように表現するかの方式です。
つまり、コードは1つだけど、それをコンピュータ内部表現では複数の方式で表現することが可能で、Unicodeは実際そうしてるのです。

UTF-16とは

UTF-16は、コード1文字を常に16ビットで表す文字符号化方式で、通常、文書の始めにBOM(Byte Order Mark)を付けます。
BOMがU+FEFFの時はビックエンディアンで、U+FFFEの時はリトルエンディアンになります。
ビックエンディアンはコードと同じバイト列で、リトルエンディアンはコードの上位バイトと下位バイトが入れ替わったバイト列です。
たとえば、コード0x0041(2バイト)の文字は、ビックエンディアンでは0x0041で、リトルエンディアンでは0x4100のなります。
ビックエンディアンは、TCP/IPネットワークで採用され、リトルエンディアンはWindowsXP(VB2005)で採用されています。


16ビットに割り当てられなかった漢字は、サロゲートペアと言う拡張仕様で、32ビットで表現する。
しかし、このケースにあたる漢字は、JIS第3第4水準の一部とのことです。

UTF-8とは

UTF-8は、コード1文字を1バイトから3バイトの範囲で符号化する方式です。
1バイトの時はASCIIコードで、3バイトの時は漢字等になります。
IEブラウザや最近のPerlでは、これに対応しています。
つまり、ASCIIコードが多い文書ではUTF-16よりバイト数が少なく、漢字が多い文書では、バイト数が多くなります。

UTF-7とは

UTF-7は、UTF-16で表したUnicodeBase64で変換して表す方式です。(あまり使われていない)

UTF-32とは

UTF-32は、コード1文字を常に32ビットで表す符号化方式。(現在、ほとんど使われていない)

まとめ

VB2005では、UTF-16のリトルエンディアンが標準。
Perlで漢字を処理するには、UTF-8が時代の流れらしい。