| この記事には
複?の問題があります
。
改善
や
ノ?トペ?ジ
での議論にご協力ください。
|
UTF-8
(ユ?ティ?エフはち、ユ?ティ?エフエイト)は
ISO/IEC 10646
(UCS) と
Unicode
で使える8
ビット
符??位(1?4
バイト
の可?長)の
文字符?化形式および文字符?化スキ?ム
。
正式名?は、ISO/IEC 10646では “UCS Transformation Format 8”、Unicodeでは “Unicode Transformation Format-8” という。?者はISO/IEC 10646とUnicodeのコ?ド重複範?で互換性がある。
RFC
にも仕?がある
[1]
。
2バイト目以降に「/」などの
ASCII
文字が現れないように工夫されていることから、
UTF-FSS
(File System Safe) ともいわれる。?名?はUTF-2。
UTF-8は、デ?タ交換方式?ファイル形式として一般的に使われる傾向にある。
?初は、
ベル?究所
において
Plan 9
で用いる
エンコ?ド
として、
ロブ?パイク
による設計指針のもと、
ケン?トンプソン
によって考案された
[2]
[3]
。
エンコ?ド?系
[
編集
]
ASCII
文字と互換性を持たせるために、ASCIIと同じ部分は1バイト、その他の部分を2?6バイトで符?化する。4バイトのシ?ケンスでは21ビット (0x1FFFFF) まで表現することができるが、Unicodeの範?外となる17面以降を表すもの(U+10FFFFより大きなもの)は受け付けない。
また、5?6バイトの表現は、ISO/IEC 10646による定義
[4]
と
IETF
によるかつての定義
[5]
で、Unicodeの範?外を符?化するためにのみ使用するが、Unicodeによる定義
[6]
とIETFによる最新の定義
[7]
では、5?6バイトの表現は不正なシ?ケンスである。
後述の
セキュリティ
の項に詳細はあるが、符?化は最少のバイト?で表現しなければならない。そのため、バイト?ごとにUnicodeの符?位置の最小値(下限)も設けている。
例えば、1バイトで表現するASCII文字は2バイト以上でも表現できるが、バイト?ごとの下限によってこれを回避している。
ビットパタ?ンは以下のようになっている。
バイト?
|
有?ビット
|
Unicode
|
2進?表記
|
16進?表記
|
1
|
0
7 bit
|
|
0
xxx-xxxx
|
|
00..7F
|
|
下限
|
U+0000
|
0
000-0000
|
00
|
上限
|
U+007F
|
0
111-1111
|
7F
|
2
|
11 bit
|
|
110
y-yyyx
|
10
xx-xxxx
|
|
C2..DF
|
80..BF
|
|
下限
|
U+0080
|
110
0-0010
|
10
00-0000
|
C2
|
80
|
上限
|
U+07FF
|
110
1-1111
|
10
11-1111
|
DF
|
BF
|
3
|
16 bit
|
|
1110
-yyyy
|
10
yx-xxxx
|
10
xx-xxxx
|
|
E0..EF
|
80..BF
|
80..BF
|
|
下限
|
U+0800
|
1110
-0000
|
10
10-0000
|
10
00-0000
|
E0
|
80
*
|
80
|
上限
|
U+FFFF
|
1110
-1111
|
10
11-1111
|
10
11-1111
|
EF
|
BF
*
|
BF
|
4
|
21 bit
|
|
1111
-
0
yyy
|
10
yy-xxxx
|
10
xx-xxxx
|
10
xx-xxxx
|
F0..F4
|
80..BF
|
80..BF
|
80..BF
|
下限
|
U+10000
|
1111
-
0
000
|
10
01-0000
|
10
00-0000
|
10
00-0000
|
F0
|
80
*
|
80
|
80
|
上限
|
U+10FFFF
|
1111
-
0
100
|
10
00-1111
|
10
11-1111
|
10
11-1111
|
F4
|
BF
*
|
BF
|
BF
|
* 第1バイトがE0のときに第2バイトが80-9Fの範?を、または同F0のときに80-8Fの範?を取るものは冗長な符?化となるため許されない。第1バイトがEDのときに第2バイトがA0以上となるものはサロゲ?トペアのための符?位置にあたり、また同F4のときに90以上となるものはUnicodeの範?外となるため、UTF-8ではやはり許されない。
Unicodeの符?位置を2進表記したものを、上のビットパタ?ンのx, yに右詰めに格納する(最少のバイト?で表現するため、yの部分には最低1回は1が出現する)。符?化されたバイト列は、
バイト順
に?わらず左から順に出力する。
1バイト目の先頭の連?するビット "1"(その後にビット "0" が1つ付く)の個?で、その文字のバイト?がわかるようになっている。また、2バイト目以降はビットパタ?ン "
10
" で始まり、1バイト目と2バイト目以降では値の範?が重ならないので、文字境界を確?に判定できる。すなわち、任意のバイトの先頭ビットが "
0
" の場合は1バイト文字、"
10
" の場合は2バイト以上の文字の2番目以降のバイト、"
110
" の場合は2バイト文字の先頭バイト、"
1110
" の場合は3バイト文字の先頭バイト、"
11110
" の場合は4バイト文字の先頭バイトであると判定できる。
7バイト以上の文字は規定されないため、
0xFE
,
0xFF
は使用されない。このため、
バイト順マ?ク
(BOM) に
0xFE
と
0xFF
を使用する
UTF-16
や
UTF-32
が、UTF-8と混同されることはない。
特?
[
編集
]
利点
[
編集
]
- ASCII文字コ?ドのテキストを?理するソフトウェアの多くがそのまま使える
[8]
。
- バイトストリ?ム中の任意の位置から、その文字、前の文字、あるいは次の文字の先頭バイトを容易に判定することができる。
- 文字列の?索を?なるバイト列の?索として行っても、文字境界と異なる個所でマッチしてしまうことがない。たとえば
Shift_JIS
で「¥」(0x5C) を?索すると「表」(0x95 0x5C) の2バイト目にマッチしたり、
EUC-JP
で「海」(0xB3 0xA4) を?索すると「ここ」(0xA4 0xB3 0xA4 0xB3) にマッチしたりするのと同?のことが起きない。このため、
マルチバイト文字
を意識せず、
ISO 8859-1
などの8ビット文字向けに作られた膨大なプログラム資産を、比較的少ない修正で再利用できる。
- ただし、他のUnicodeの符?化と同?に、?にバイト列の比較では文字列が同一か判?できない場合がある。詳細は、
Unicodeの等?性
および
正規化
を?照のこと。
- UTF-16
や
UTF-32
と異なり、バイト?位の入出力を行うため、
バイト順
の影響がない。
- 21ビットまで表現できるため、
サロゲ?トペア
を使用する必要がない。
- ASCII文字が主?の文書であれば、ほとんどデ?タサイズを?やさずにUnicodeのメリットを享受できる。UTF-16やUTF-32では、デ?タサイズはほぼ2倍、4倍となる。
- 複?のUTF-8文字列を、?なる符?なし8ビット整?の配列とみなして?書順ソ?トした結果は、Unicodeの符?位置の?書順のソ?ト結果(すなわちUTF-32に?換した後にソ?トした結果)と等しくなる。これに?して、サロゲ?トペアを含むUTF-16文字列を符?なし16ビット整?の配列とみなしてソ?トした結果は、Unicodeの符?位置の?書順のソ?ト結果と異なりうる。
欠点
[
編集
]
- UTF-8による符?化では、
漢字
や
?名
などの表現に3
バイト
を要する。このように、東アジアの??文字コ?ドでは
マルチバイト符?
を用いて1文字2バイトで表現されていたデ?タが、1.5倍かそれ以上のサイズとなる。同?に、
ISO/IEC 8859-1
では1バイトで表現できた非ASCIIのラテン文字(
ウムラウト
付きの文字など)も2バイトとなるし、その他の
ISO/IEC 8859シリ?ズ
に?する文字符?ではデ?タ量がさらに?大しうる。
- 最短ではない符?やサロゲ?トペアなど、UTF-8の規格外だがチェックを行わないプログラムでは一見正常に扱われるバイト列が存在する。これらのバイト列を入力として受け入れてしまうと、プログラムが予期しない範?のデ?タを生成するため、セキュリティ上の脅威となりうる
[9]
。
サロゲ?トペアの扱い
[
編集
]
UTF-16
では
サロゲ?トペア
で表されるような、
基本多言語面
外の符?位置をUTF-8で表す時は、?換元がUTF-16でサロゲ?トペアの時には
U+D800
?
U+DBFF
,
U+DC00
?
U+DFFF
を表すUTF-8にそのまま?換したりはせず、
U+10000
?
U+10FFFF
の符?位置にデコ?ドしてから?換する。そのままUTF-8で符?化したような列は不正なUTF-8とされる。
サロゲ?トペアのままUTF-8と同等の符?化を行う符?化は、
CESU-8
(
Compatibility Encoding Scheme for UTF-16: 8-Bit
) として別途定義されている。?用に供されている例としては、
Oracle Database
のバ?ジョン8以前において、UTF-8として3オクテットまでのオクテット列しか扱えなかったために定義されたものである。本?のUTF-8における4オクテット列の代わりに、サロゲ?ト符?位置を表す3オクテット列のペア(上位が
ED A0 80
?
ED AF BF
、下位が
ED B0 80
?
ED BF BF
)で表現される。
現在のOracle Databaseでも、CESU-8を「UTF8」として、「普通のUTF-8」を「AL32UTF8」として扱っているため注意を要する。
MySQL
でも「utf8」を指定した場合は4オクテット列が扱えず、CESU-8相?の符?化を必要とする(4オクテット列??のUTF-8は「utf8mb4」として別途定義されているが、MySQL 5.5.3以降でないと使用できない
[10]
)。
また、
Java
の一部の?部??で用いられている
Modified UTF-8
も、サロゲ?トペアをそのまま?す仕?となっている。ただし、NULL文字を
C0 80
とエンコ?ドする(これもUTF-8規格外)点で、CESU-8とも異なる??となっている。
セキュリティ
[
編集
]
UTF-8のエンコ?ド?系には
冗長性
があり、同じ文字を符?化するのに複?の表現が考えられる(例: スラッシュ記?である「/」を 0x2F という1バイトで表現するのではなく、0xC0 0xAF という2バイトもしくはそれより大きなバイト?で表現する)。かつてはそのような表現も許容されていたが、
ディレクトリトラバ?サル
などの?策として行われる文字列?査を冗長な表現によりすり?ける手法が知られるようになったため、現在の仕?では最少のバイト?による表現以外は不正なUTF-8シ?ケンスとみなさなければならない
[11]
。
ISO/IEC 10646の定義が5バイト以上の表現を許容していることにより、正しくない??を行った
バグ
のあるシステムにおいてエンコ?ド時に
バッファオ?バ?フロ?
が?生する可能性も指摘されている。
文字種
[
編集
]
バイト順マ?クの使用
[
編集
]
UTF-8で符?されたテキストデ?タは
バイト順マ?ク
(BOM) の付加は不要である(
エンディアン
に?わらず同じ?容になるので)。
しかし、テキストデ?タがUTF-8で符?化されていることの標識として、デ?タの先頭にEF BB BF(16進。UCSでの
バイト順マ?ク
U+FEFFのUTF-8での表現)のシ?ケンスをBOMとして付加することが許される(推?はされない)。
- この3バイトは、ZERO WIDTH NON-BREAKING SPACE を表すが、デ?タ先頭では
バイト順マ?ク
の機能を持たせている。
- なお、日本の特殊事情として、このシ?ケンスがある方を
UTF-8
、ない方を特に
UTF-8N
と呼び分けることもあるが
[12]
、日本以外ではほとんど知られておらず、また公的規格などによる裏付けもない
[13]
。
プログラム?アプリケションソフトの???況の問題
[
編集
]
BOM付きには??しないプログラムは標準的ではある。それらは、BOMを余分なデ?タとみなすので、問題も生ずる。
例えば、
Unix系
OSにおける?行可能
スクリプト
は、ファイル先頭が「
#!
」から始まるとき、それに?く文字列を
インタプリタ
のコマンドとして認識するが、多くのシステムでは、このシ?ケンスが存在するとこの機能が?かず?行できない。PHPでは、
<?PHP
の前に出力されるため、
header()
??の?行に失敗する原因となる。
HLSL
や
GLSL
の
シェ?ダ?
プログラム
コンパイラ
(fxcやglslangValidator)はBOMを?理できず、コンパイルエラ?となる。
一方、一部のテキスト?理アプリケ?ション(
テキストエディタ
など)ではBOMを前提とした動作をする
[14]
。同?にこのシ?ケンスがない場合、UTF-8と認識できないプログラムも存在する。たとえば、
Microsoft Excel
では、
CSVファイル
を開くとき、このシ?ケンスが付加されていないUTF-8の場合は正常に?み?むことができず文字化けを生ずる
[15]
。
Microsoft Visual C++
は?定でBOMなしUTF-8を認識せず、システムロケ?ル設定に?じたマルチバイトエンコ?ディングとみなすが、Visual C++ 2015以降ではコンパイルオプションを指定することでBOMなしUTF-8を認識することができるようになった
[16]
。
Windows 10
のメモ帳アプリは、
2019年
の
19H1アップデ?ト
からBOM無しUTF-8がデフォルトになった
[17]
。
また、BOMがなくともエンコ?ド自動推定によってUTF-8とShift_JISなどを?別することのできるプログラムもあるが、ASCII部以外の文字が少ない場合に誤認することが多い。
プロトコルが常にUTF-8であることを?制しているものである場合はこのシ?ケンスを禁止するべきで、この場合ファイル先頭にこのシ?ケンスが現れると “ZERO WIDTH NO-BREAK SPACE” と見なされる。逆にプロトコルがそれを保?しない場合このシ?ケンスは禁止されずファイル先頭のそれはバイト順マ?クと見なされる
[18]
。
脚注
[
編集
]
?考資料
[
編集
]
?連項目
[
編集
]
|
---|
日本語
用の
文字コ?ド
|
|
---|
日本語を含む
多言語文字集合
|
|
---|
日本語以外用の
文字集合
|
|
---|
ソフトウェア
| |
---|
?分け
| |
---|
?念
| |
---|
?連トピック
| |
---|
カテゴリ
|