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だろう。

参考サイト * http://www.kanzaki.com/docs/jcode.html

名前:宮内 はじめ

Code for Nagoya名誉代表

E2D3名古屋支部長

プログラマーです。GISやデータビズが好きです。このサイトは宮内の個人的なメモです。

プロフィール

お問い合わせ