Unicode
符号化方式
UTF-7
UTF-8
CESU-8
UTF-16/UCS-2
UTF-32/UCS-4
UTF-EBCDIC
SCSU
Punycode (IDN/IDNA)
GB 18030
UCS
マッピング
書字方向
BOM
漢字統合
UnicodeとHTML
Unicodeと電子メール
Unicodeフォント
UTF-8(旧UTF-2)はUCS(ISO/IEC 10646)、Unicodeで使える符号化方式。 正式名称は、ISO/IEC 10646では'UCS Transformation Format 8'、Unicodeでは'Unicode Translation Format-8'という。 両者はUCS-4とUnicodeのコード重複範囲で互換性がある。 2バイト目以降に'/'などのコードが現れないように工夫されていることから、'UTF-FSS'(File System Safe)ともいわれる。 RFCにも仕様がある。
データ交換方式、ファイル形式としては一般的にUTF-8が使われる傾向がある。 Linux等では、OSの標準文字エンコードとして使用される例も増えている。
当初は、Plan 9で用いるエンコードとしてベル研究所で考案された。
目次
1 エンコード体系
2 特徴
2.1 メリット
2.2 デメリット
3 サロゲートペアの扱い
4 セキュリティ
5 日本語の文字とバイト数
6 バイトオーダーマークについて
7 関連項目
8 脚注
//
ASCII文字と互換性を持たせるために、ASCIIと同じ部分は1バイト、その他の部分を2?6バイトで符号化する。5?6バイトの表現は、ISO/IEC 10646による定義[1]とIETFによるかつての定義[2]で、Unicodeの範囲外を符号化するためにのみ使用する。Unicodeによる定義[3]とIETFによる最新の定義[4]では、5?6バイトの表現は不正なシーケンスである。また4バイトのシーケンスでも、Unicodeの範囲外となる17面以降を表すものは受け付けない。
ビットパターンは以下のようになっている。0xxxxxxx (00-7f)110yyyyx 10xxxxxx (c2-df)(80-bf)1110yyyy 10yxxxxx 10xxxxxx (e0-ef)(80-bf)(80-bf)11110yyy 10yyxxxx 10xxxxxx 10xxxxxx (f0-f7)(80-bf)(80-bf)(80-bf)111110yy 10yyyxxx 10xxxxxx 10xxxxxx 10xxxxxx (f8-fb)(80-bf)(80-bf)(80-bf)(80-bf)1111110y 10yyyyxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx (fc-fd)(80-bf)(80-bf)(80-bf)(80-bf)(80-bf)
Unicodeのコードポイントを2進表記したものを、上のビットパターンのx, yに右詰めに格納する。 最短のバイト数で符号化するため、yの部分には最低1回は1が出現する。 符号化されたバイト列は、バイトオーダーに関わらず左から順に出力する。
7バイト以上の文字は規定されないため、fe, ffは使用されない。このため、BOM付きのUTF-16とUTF-8を混同することはない。
1バイト目の上位ビットの1の個数でその文字のバイト数が判るようになっている。また、2バイト目以降は10で始まり、1バイト目と2バイト目以降では値の範囲が重ならないので、文字境界を確実に判定できる。
メリット
バイトストリーム中の任意の位置から、その文字、前の文字、あるいは次の文字の先頭バイトを容易に判定することができる。
文字列の検索を単なるバイト列の検索として行っても、文字境界と異なる個所でマッチしてしまうことがない。たとえばShift_JISで「\」を検索すると「表」の2バイト目にマッチしたり、EUC-JPで「海」を検索すると「ここ」にマッチしたりするのと同様のことが起きない。このため、マルチバイト文字を意識せず、ISO 8859-1などの8bit文字向けに作られた膨大なプログラム資産を、比較的少ない修正で再利用できる。
UTF-16やUTF-32と異なり、バイト単位の入出力を行うため、バイトオーダーの影響が無い。
31bitまで表現できるため、サロゲートペアを使用する必要がない。
ASCII文字が主体の文書であれば、ほとんどデータサイズを増やさずにUnicodeのメリットを享受できる。UTF-16やUTF-32では、データサイズはほぼ2倍、4倍となる。
デメリット
漢字(仮名含む)の表現に3バイトを要する。そのため日本語の文章はShift_JISやEUC-JPなどと比較して1.5倍のサイズとなる。同様に、ISO 8859-1では1バイトで表現できた非ASCIIのラテン文字(ウムラウト付きの文字など)も2バイトとなり、データサイズが大きくなる。
文字数とデータサイズが比例しないため、文字数を調べるには、先頭から全データを読み取る必要がある。
最短ではない符号、サロゲートペアなど、UTF-8の規格外だが、チェックを行わないプラグラムでは一見正常に扱われる文字列を作ることができてしまう。このため、セキュリティへの配慮が必要となる。
UTF-16のサロゲートペアで表されるBMP外の文字をUTF-8に変換するときは、まずU+10000以降の値にデコードしてから符号化しなければならない。サロゲートペアに使われるU+D800からU+DFFFまでの範囲をUTF-8でそのまま符号化することは禁止されており、不正なシーケンスとみなされる。
サロゲートペアを残したままUTF-8と同等の符号化を行う規格は、CESU-8(Compatibility Encoding Scheme for UTF-16: 8-Bit)として別途定義されている。 これは、Oracle Databaseのバージョン8以前において、4バイト以上のUTF-8文字を扱えなかったために便宜的に定義されている。