UTF-8のエンコード体系には冗長性があり、同じ文字を符号化するのに複数の表現が考えられる。かつてはそのような表現も許容されていたが、ディレクトリトラバーサルなどの対策として行われる文字列検査を冗長な表現によりすり抜ける手法が知られるようになったため、現在の仕様では最も短いバイト数による表現以外は不正なUTF-8シーケンスとみなさなければならない。
また、ISO/IEC 10646の定義が5バイト以上の表現を許容していることにより、注意深さの足りない実装でエンコード時にバッファオーバーフローが発生する可能性も指摘されている。
日本語の文字とバイト数
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の範囲外(どんな文字が登録されるかという計画も無い)
UTF-8で符号されたテキストデータはエンディアンに関わらず同じ内容になるので、UTF-8で符号化されていることが確定しているのならバイトオーダーマーク (英: Byte Order Mark。以下BOM) を付加する必要はない。しかし、一部のテキスト処理アプリケーション (エディタなど) では、作成したテキストデータの先頭にBOMを付加する (付加するかどうかを選択できるものもある)。付加する場合は、EF BB BF (16進。U+FEFFのUTF-8での表現) をデータの先頭に付加する。なお、BOMありの方をUTF-8、なしの方をUTF-8Nと呼ぶこともあるが、このような呼び分けは日本以外ではほとんど知られておらず、また公的規格などによる裏付けもない。このため、UTF-8という呼び名を使っていれば情報交換の相手が文書先頭にBOMがあると見なすと期待すべきではないし、いっぽう、UTF-8Nという呼び名は情報交換の際に用いるべきではない。
BOMを付加する目的は、その文書がUTF-8であることを確実に認識できるようにするためだと考えられる。 一方で、UTF-8のBOMを認識しない(単に8ビットスルーであるというだけの、正式にはUTF-8に対応していない)プログラムでは、BOMが余分なデータとみなされて問題となる場合もある。例えば、UNIX系OSにおける実行可能スクリプトは、ファイル先頭が「#!」から始まるとき、それに続く文字列をインタプリタのコマンドとして認識するが、現状の多くのシステムでは、BOMが存在するとこの機能が働かず実行できない。ただし、これはテキストエディタで編集可能とはいえ、あくまでも実行可能な“バイナリ形式”での事例であり、テキストファイルにおけるBOMの取り扱いとは別の問題である。
逆にBOMがないとUTF-8と認識できないプログラムも存在する (とくにASCII部以外の文字が少ない場合に誤認することが多い)。
プロトコルが常にUTF-8である事を強制しているものである場合はBOMを禁止するべきで、この場合ファイル先頭のBOMは "ZERO WIDTH NO-BREAK SPACE" と見なされる。逆にプロトコルがそれを保証しない場合BOMは禁止されずファイル先頭のそれはBOMと見なされる[6]。
関連項目
文字コード
脚注^ ⇒ISO/IEC 10646:2003 Information technology -- Universal Multiple-Octet Coded Character Set (UCS)
^ ⇒RFC 2279 UTF-8, a transformation format of ISO 10646
^ ⇒The Unicode Standard, Version 5.0
^ ⇒RFC 3629 UTF-8, a transformation format of ISO 10646
^ ⇒RFC 3629, pp.9f.
^ ⇒RFC 3629 ⇒6. Byte order mark (BOM)
カテゴリ: Unicode
更新日時:2008年11月17日(月)12:36
取得日時:2008/11/19 01:38