UTF-8
この
|
UTF-8(ユーティーエフはち、ユーティーエフエイト)はISO/IEC 10646 (UCS) とUnicodeで
2バイト
UTF-8は、データ
エンコード体系
編集
ASCII
また、5–6バイトの
ビットパターンは
バイト |
Unicode | 2 |
16 | ||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
1 | 7 bit | 0xxx-xxxx | 00..7F | ||||||||
U+0000 | 0000-0000 | 00 | |||||||||
U+007F | 0111-1111 | 7F | |||||||||
2 | 11 bit | 110y-yyyx | 10xx-xxxx | C2..DF | 80..BF | ||||||
U+0080 | 1100-0010 | 1000-0000 | C2 | 80 | |||||||
U+07FF | 1101-1111 | 1011-1111 | DF | BF | |||||||
3 | 16 bit | 1110-yyyy | 10yx-xxxx | 10xx-xxxx | E0..EF | 80..BF | 80..BF | ||||
U+0800 | 1110-0000 | 1010-0000 | 1000-0000 | E0 | 80* | 80 | |||||
U+FFFF | 1110-1111 | 1011-1111 | 1011-1111 | EF | BF* | BF | |||||
4 | 21 bit | 1111-0yyy | 10yy-xxxx | 10xx-xxxx | 10xx-xxxx | F0..F4 | 80..BF | 80..BF | 80..BF | ||
U+10000 | 1111-0000 | 1001-0000 | 1000-0000 | 1000-0000 | F0 | 80* | 80 | 80 | |||
U+10FFFF | 1111-0100 | 1000-1111 | 1011-1111 | 1011-1111 | F4 | BF* | BF | BF |
*
Unicodeの
1バイト
7バイト0xFE
, 0xFF
は0xFE
と0xFF
を
特徴
編集
利点
編集
- 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ではサロゲートペアでU+D800
–U+DBFF
, U+DC00
–U+DFFF
をU+10000
–U+10FFFF
の
サロゲートペアのままUTF-8とED A0 80
–ED AF BF
、ED B0 80
–ED BF BF
)で
また、JavaのC0 80
とエンコードする(これもUTF-8
セキュリティ
編集
UTF-8のエンコード
ISO/IEC 10646の
文字種
編集
B | Unicode | スクリプト | JIS X 0201 | JIS X 0208 | JIS X 0212 | JIS X 0213 |
---|---|---|---|---|---|---|
1 | U+0000–U+007F | ASCII | Roman( |
|||
2 | U+0080–U+07FF | |||||
3 | U+0800–U+FFFF | オーバーライン、Kana | ||||
4 | U+10000–U+10FFFF |
バイト順 マークの使用
編集
UTF-8で
しかし、テキストデータがUTF-8で
- この3バイトは、ZERO WIDTH NON-BREAKING SPACE を
表 すが、データ先頭 ではバイト順 マークの機能 を持 たせている。 - なお、
日本 の特殊 事情 として、このシーケンスがある方 をUTF-8、ない方 を特 にUTF-8Nと呼 び分 けることもあるが[12]、日本 以外 ではほとんど知 られておらず、また公的 規格 などによる裏付 けもない[13]。
プログラム・アプリケションソフトの対応 状 況 の問題
編集
BOM
<?PHP
のheader()
また、BOMがなくともエンコード
プロトコルが
脚注
編集
- ^ RFC 3629 UTF-8, a transformation format of ISO 10646
- ^ RFC 3629 Page-3
- ^ Rob Pike's UTF-8 history
- ^ 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.2
- ^ RFC 3629 UTF-8, a transformation format of ISO 10646
- ^ ただし、バイト
順 マーク (BOM) が付加 されている場合 や、テキストを7ビットで処理 するソフトウェア、内部 的 に最 上位 ビットを使用 しているソフトウェアなど、使 えないものも存在 する - ^ RFC 3629, pp.9f.
- ^ “10.1.10.6 The utf8mb4 Character Set (4-Byte UTF-8 Unicode Encoding)”. dev.mysql.com. MySQL 5.5 Reference Manual. Oracle. 2015
年 12月1日 02:10:55時 点 のオリジナルよりアーカイブ。2015年 12月11日 閲覧 。 - ^ Windowsにおける
有名 なワームであるNimdaウイルスは、IISにおけるUTF-8の脆弱 性 をもちいたものである。(はせがわようすけ 2009) - ^ Mark Davis. “Forms of Unicode” (
英語 ). IBM. 2005年 5月 6日 時点 のオリジナルよりアーカイブ。2013年 9月 18日 閲覧 。 - ^ このため、UTF-8という
呼 び名 を使 っていれば情報 交換 の相手 が文書 先頭 にこのシーケンスがあると見 なすと期待 すべきではないし、また、UTF-8Nという呼 び名 は情報 交換 の際 に用 いるべきではない。 - ^ TeraPad、EmEditor、MIFESのようにBOMを
付加 するかどうかを選択 できるものもある。 - ^ マイクロソフト・サポート https://support.microsoft.com/en-us/office/opening-csv-utf-8-files-correctly-in-excel-8a935af5-3416-4edd-ba7e-3dfd2bc4a032
- ^ /source-charset (Set Source Character Set) | Microsoft Docs
- ^ “「メモ
帳 」に多数 の改善 、BOMなしUTF-8がデフォルト保存 形式 に ~「Windows 10 19H1」”. Impress. 2023年 1月 26日 閲覧 。 - ^ RFC 3629 6. Byte order mark (BOM)
参考 資料
編集
用語 の日本語 表記 は原則 として「“Unicode Terminology English - Japanese”. Unicode, Inc. 2010年 1月 1日 閲覧 。」にならった。- はせがわようすけ (2009
年 5月 8日 ). “本当 は怖 い文字 コードの話 :第 4回 UTF-8の冗長 なエンコード”.技術評論社 . 2014年 9月 10日 閲覧 。