UTF-8 【UCS Transformation Format 8】 Unicode Transformation Format-8
概要
UTF-8(UCS Transformation Format 8)とは、Unicodeで定義された文字集合を表現することができる文字コード(符号化方式)の一つ。一文字を1~4バイトの可変長で表現するもので、様々な言語の文字を扱える文字コードとしては世界的に最も普及している。「Unicode」は国際的な業界団体であるUnicodeコンソーシアムが策定している多言語文字コードの規格で、ISO(国際標準化機構)およびIEC(国際電気標準会議)が策定した国際標準(ISO/IEC 10646)ではこれと実質的に同じものを「UCS」(Universal multi-octet Character Set)と呼んでいる。
Unicodeでは、収録されている文字にそれぞれ固有の識別番号である「コードポイント」(符号位置)を与えている。この値をビット列として表現する規則を「文字符号化方式」(符号化スキーム)と呼び、UTF-8やUTF-16、UTF-32などの方式がある。UTF-8は最も普及している方式で、Unicodeを用いるほとんどの場面で符号化方式としてUTF-8が用いられる。
UTF-8は最大で2097151番(U+1FFFFF)までのコードポイントを表現できるが、Unicode/UCSで定義される文字セットとして有効なのは1114111番(U+10FFFF)までであるため、これを超える値は無効とされる。初期の仕様では最大6バイト(U+7FFFFFFFまで)とされていたが、後に4バイトまでに縮小された。
ASCII文字と各国語の文字
英数字の文字コードとして世界的に普及しているASCIIで規定される7ビットの範囲(0~127番)の文字は、そのコードをそのまま用いるようにできている。ASCIIに収録された英数字や記号は1バイトで表現でき、かつ、各文字のコードもASCIIと同一になる。
一方、大陸欧州などで一般的なISO/IEC 8859などの文字コードは、ASCIIに1ビット追加して8ビット(1バイト)とし、拡張された後半128~255番にアクセント記号付きの文字などを収録していた。UTF-8ではこれらの文字の多くは2バイト(16ビット)で表現される。
日本語や中国語、韓国・朝鮮語など、従来から2バイトの文字コード体系を言語ごとに独自に定めていた言語圏では、UTF-8ではほとんどの文字が3バイト(24ビット)となる。従来コードに比べ英語圏は1文字1バイトのままだが、8ビット言語圏は2バイトに、2バイト言語圏は3バイトに増加するため不公平だとする声もある。
符号化の方法
128番以降の文字はコードポイントの上位ビット側から変換ルールに従って複数のバイト列に当てはめていき、得られたバイト列を順に並べる。処理はバイト単位で行われるため、16ビット単位の値を用いるUTF-16などと異なりエンディアンの識別が不要となっている。
1バイト表現の先頭は0から始まるが、複数バイト表現の場合、1バイト目は「11」から、2バイト目は「10」から始まる。これにより、文字列データ中のどの位置のバイトを取り出しても、それが1バイト表現(ASCII互換文字)なのか、複数バイト表現の先頭あるいは途中なのかを容易に判別できる。
長さが2バイトの場合の1バイト目は「110」から始まり、同様に3バイトの場合は「1110」、4バイトは「11110」から始まる。先頭バイトの1が連続する数を調べれば続く何バイトが同じ文字を表すのか知ることができる。
例えば、2バイトのUTF-8コードは1バイト目が「110xxxxx」、2バイト目が「10xxxxxx」という形式で、計11ビットあるxの部分の左から順にコードポイントの2進表現を上位ビット側から当てはめていく。最長の4バイト表現ではコードポイントを格納するビット列は合わせて21ビット分確保される。
長いバイト表現は短いバイト表現の文字を表すこともできるため、例えばASCII互換文字は1バイト表現から4バイト表現まで4通りのビットパターンが存在することになるが、規格上は最も短い表現以外は無効な表現とみなされる。すなわち、2バイト以上では表現可能なコードポイントの上限だけでなく下限(2バイトの場合はU+0080未満は無効)が存在する。
バイトオーダーマーク (BOM)
UTF-16やUTF-32では16ビット単位や32ビット単位の連続したビット列で1文字を表現するため、1バイト(8ビット)単位でデータを取り出したときに先頭側が上位ビットなのか下位ビットなのか識別しなければならない。この並び順(エンディアン)を区別するため、これらの形式ではテキストファイルなどの先頭に「バイトオーダーマーク」(BOM:Byte Order Mark)を記載する仕組みがあった。
UTF-8ではバイト順の認識が不要なためエンディアンを指示するBOMも存在しないが、代わりにエンコード形式がUTF-8であることを伝達する符号を先頭に記載してもよい(しなくてもよい)ことになっている。この符号は先頭から順に16進数で「EF BB BF」であり、バイト順を指定するものではないが他の方式との整合性から便宜上BOMと呼ばれている。