UTF-8
出典: フリー百科事典『ウィキペディア(Wikipedia)』
UTF-8(旧UTF-2)はUCS(ISO/IEC 10646)、Unicodeで使える符号化方式。 正式名称は、ISO/IEC 10646では'8-bit UCS Transformation Format'、Unicodeでは'Unicode Translation Format-8'という。 両者はUCS-4とUnicodeのコード重複範囲で互換性がある。 2バイト目以降に'/'などのコードが現れないように工夫されていることから、'UTF-FSS'(File System Safe)ともいわれる。 'RFC 2279'にもISO/IEC 10646と同様の仕様がある。
データ交換方式、ファイル形式としては一般的にUTF-8が使われる傾向がある。 Wikipediaでも全面的に採用されている。
目次 |
[編集] エンコード体系
ASCII文字と互換性を持たせるために、ASCIIと同じ部分は1バイト、その他の部分を2~6バイト(Unicodeの範囲では2~4バイト)で指定する。
ビットパターンは以下のようになっている。
0xxxxxxx (00-7f) 110xxxxx 10xxxxxx (c0-df)(80-bf) 1110xxxx 10xxxxxx 10xxxxxx (e0-ef)(80-bf)(80-bf) 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx (f0-f7)(80-bf)(80-bf)(80-bf) 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx (f8-fb)(80-bf)(80-bf)(80-bf)(80-bf) 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx (fc-fd)(80-bf)(80-bf)(80-bf)(80-bf)(80-bf)
1バイト目の上位ビットの1の個数でその文字のバイト数が判るようになっている。また、2バイト目以降は10で始まり、1バイト目と2バイト目以降では値の範囲が重ならないので、文字境界を確実に判定できる。 そのため以下のようなメリットがある。
- バイトストリーム中の任意の位置から、その文字、前の文字、あるいは次の文字の先頭バイトを容易に判定することができる。
- 文字列の検索を単なるバイト列の検索として行っても、文字境界と異なる個所でマッチしてしまうことがない。
デメリットには以下のようなものがある。
[編集] 日本語の文字とバイト数
- 1バイト
- ASCIIの全て(実装系によりJIS X 0201/Windows-31Jの当該エリアの場合あり)
- 2バイト
- JIS X 0208の非漢字の一部
- 3バイト
- JIS X 0201の8ビット文字(半角カタカナ)
- JIS X 0208の漢字エリアの全て
- JIS X 0212の漢字エリアの全て
- JIS X 0213の第3・4水準漢字の一部
- Windows-31Jの拡張文字エリア全て
- 4バイト
- UnicodeのBMP面以外全て
- JIS X 0213の第3・4水準漢字の一部
- 5~6バイト
- Unicodeの範囲外(どんな文字が登録されるかという計画も無い)
[編集] BOMについて
UTF-8はエンディアンに関わらず同じ内容になるので、本来はBOM(Byte Order Mark)を付加する必要はないが、一部のエディターなどではBOMの有無を選択できる。この際、BOMありの方をUTF-8、なしの方をUTF-8Nと呼ぶこともあるが、このような使い分けは日本以外ではほとんど知られておらず、また公的規格などによる裏付けもないため、その使用には注意が必要である。
BOMを付加した場合、UTF-8のBOMを認識するプログラムでは、その文書がUTF-8であることをほぼ確実に自動認識できる。 一方で、UTF-8のBOMを認識しない(あるいは、そもそもUTF-8自体を認識しない)プログラムでは、BOMがゴミとみなされて問題となる。 とくに、プログラミング言語やMakefileのように文法が厳密に決まっているものの場合、エラーになってしまう。