Unicode は計17面、21ビットまで。UTF-8 は4バイトまで。

UTF-8 の仕様を知ったとき、U+0080 以降では1バイト目が C0~FF、
2バイト目以降が 80~BF の範囲内になっていて、EUC とかと違って
文字の先頭バイトの位置が確認できる仕様は賢いと思った。
 
その頃の UCS-4 では、1文字31ビットで最大で128群×256面×65,536文字の
収録が想定されていて(または32ビットだったかも…?)、
それをUTF-8 で表すと1文字あたり最大6バイト長まで続く仕様だったけど、
今は Unicode では、第16面(~U+10FFFF)とまでに確定していたんですね。
 
これに伴い、UTF-8 も1文字あたり最大4バイト長 に減ってた。

通常の日本語文書(BMP範囲内)を扱う場合は3バイト長で足りていたので、
実用的には何の影響もないけど、ちょっと驚いた。

というわけで、現在の仕様では UTF-8 は以下になるらしい。
 
Table 3-6. UTF-8 Bit Distribution より
コードポイントビットパターン1バイト目2バイト目3バイト目4バイト目
U+0000~U+007F0xxxxxxx0xxxxxxx
U+0080~U+07FF00000yyy yyxxxxxx110yyyyy10xxxxxx
U+0800~U+FFFFzzzzyyyy yyxxxxxx1110zzzz10yyyyyy10xxxxxx
U+010000~U+10FFFF  000uuuuu zzzzyyyy yyxxxxxx  11110uuu10uuzzzz10yyyyyy10xxxxxx

 
2進数でなくて16進数で書くと以下の通り。
 
Table 3-7. Well-Formed UTF-8 Byte Sequences
コードポイント1バイト目2バイト目3バイト目4バイト目
U+0000~U+007F00~7F
U+0080~U+07FFC2~DF80~BF
U+0800~U+0FFFE0A0~BF80~BF
U+1000~U+CFFFE1~EC80~BF80~BF
U+D000~U+D7FFED80~9F80~BF
U+E000~U+FFFFEE~EF80~BF80~BF
U+010000~U+03FFFF  F090~BF80~BF80~BF
U+040000~U+0FFFFF  F1~F380~BF80~BF80~BF
U+100000~U+10FFFF  F480~8F80~BF80~BF

 
ちなみに第16面は、第0面(BMP) から数えて17面目にあたる。
17という数字は、なんだか計算機的にはしっくりこない数字だけど、
UTF-16のサロゲートで表現できる範囲が、第1~16面になるので、
第0面(BMP) と第1~16面を合わせると、計17面となる。(21ビット弱)
サロゲートの仕様に合わせて、将来 Unicode で使う文字の範囲が決まったのかな?
 
サロゲートペア とは、BMP の範囲のうち high surrogates (D800~DB7F) と
low surrogates (DC00~DFFF) のそれぞれ1024文字分のコードポイントの
組み合わせで、1024×1024=20ビット分=16面分を表す仕組み。

この記事へのコメント

この記事へのトラックバック

  • unicode 5.0

    Excerpt: コンピュータで文字を扱うための共通規格Unicodeの最新動向。 Weblog: 天気晴れ - ITと趣味のブログ racked: 2008-11-11 07:19