Unicodeについてのあれこれ
投稿日: 2006年01月23日 更新日: 2017年07月22日
Unicode、といって一番メジャーな文字符号化方式は多分UTF-8。大抵の場合コレだけ知ってればなんとかなる。
が、それ以外のものも使い出すと混沌としてくるのでメモ。
- UTF-7/8/16/32
- UCS-2/UCS-4
- BOM
- サロゲートペア
- C言語におけるUnicode
まず、UnicodeとUCS-2/UCS-4は文字集合(character set)のことでUTF-7/8/16/32は文字符号化方式(character encoding)である。
UnicodeとUCS-2/4は策定団体が違った(それぞれUnicode ConsortiumとISO)らしいが、利用する上ではあまり関係ないので言及しない。
UCS-2/4は1文字をそれぞれ2バイトまたは4バイトで表す文字集合。当初2バイトで収まると思ってたけど、やっぱり無理だったから4バイトに拡張しました。という説明をよく見かける。
で、それらの文字集合はただの「集合」でしかないので、実際のデータとして使うためには文字符号化方式が必要になる。それがUTF-7/8/16/32。つまりUCS(Universal Multiple-Octet Coded Character Set)あってのUTF(Unicode Transfer Format)。
UTF-8は1バイトから6バイトまでの可変長コードでUCS-2/UCS-4を表現できる。また、US-ASCIIと互換性があるため、ASCII文字のみで構成されたUTF-8データ(BOMなし)はASCIIデータと一致する。
UTF-16は当初2バイトの固定長コードでUCS-2コードと等価の扱いやすい符号化方式になるはずだったように見える。が、UCS-4を表現すべく「サロゲートペア」というものが導入され、2バイトまたは4バイトの可変長コードになってしまった。それから固定長であったためにエンディアンの影響を受ける。UTF-16LE/BEと表記されるのはそれぞれリトルエンディアン/ビッグエンディアンのUTF-16である。また、エンディアンを判定するために先頭2バイトにBOM(Byte Order Mark)と呼ばれるエンディアン判定のダミーコードが挿入されることがある。
よってUTF-16はBOMあり/なし、LE/BEの4種類存在する。
UTF-32はUCS-4を表現できる4バイト固定長コード。これもUTF-16と同じくエンディアンの影響を受けるためBOMあり/なし、LE/BEの4種類存在する。
UTF-7については使わないので調べてない。多分メールなんかで使うために8ビット目を使わない可変長コードなのでは。(適当)
ちなみにエンディアンの影響を受けないはずのUTF-8においてもBOMは存在する。仕様によるとつけてもつけなくても良いことになっている。つけたら間違い、というわけではない。また、BOMなしのUTF-8をUTF-8nを表記することがある。
ちなみにC/C++におけるワイド文字表現であるwchar_tは、仕様ではエンコードに関する記述はない。VC++における実装は2バイトで、gccは4バイト。
VC++においてはwchar_tにはUTF-16ではなくUCS-2を入れることを想定してるんだろうか?マルチバイト系関数の実装を見てみないとなんともいえないが、サロゲートペアが意識されてればUTF-16だし、されてなければUCS-2だろう。
名前:宮内 はじめ
Code for Nagoya名誉代表
E2D3名古屋支部長
プログラマーです。GISやデータビズが好きです。このサイトは宮内の個人的なメモです。