(Translated by https://www.hiragana.jp/)
UTF-8 - Wikipedia

UTF-8

符号ふごう単位たんい既定きていしたUnicode文字もじ符号ふごう形式けいしきおよ文字もじ符号ふごうスキーム

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 07 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

* だい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) に0xFE0xFF使用しようするUTF-16UTF-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-16UTF-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シリーズぞくする文字もじ符号ふごうではデータりょうがさらに増大ぞうだいしうる。
    • なお、1バイトが9ビットである処理しょりけいでは、この問題もんだいをあまり発生はっせいさせずに符号ふごうできるはずである。このアイディアにもとづいたジョークRFCRFC 4042 "UTF-9" として2005ねんエイプリルフール4がつ1にち)に公開こうかいされた。
  • 最短さいたんではない符号ふごうやサロゲートペアなど、UTF-8の規格きかくがいだがチェックをおこなわないプログラムでは一見いっけん正常せいじょうあつかわれるバイトれつ存在そんざいする。これらのバイトれつ入力にゅうりょくとしてれてしまうと、プログラムが予期よきしない範囲はんいのデータを生成せいせいするため、セキュリティじょう脅威きょういとなりうる[9]

サロゲートペアのあつか 編集へんしゅう

UTF-16ではサロゲートペアあらわされるような、基本きほん多言たげんめんそと符号ふごう位置いちをUTF-8であらわときは、変換へんかんもとがUTF-16でサロゲートペアのときには U+D800U+DBFF, U+DC00U+DFFFあらわすUTF-8にそのまま変換へんかんしたりはせず、U+10000U+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 80ED AF BF下位かいED B0 80ED 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バイト以上いじょう表現ひょうげん許容きょようしていることにより、ただしくない実装じっそうおこなったバグのあるシステムにおいてエンコードバッファオーバーフロー発生はっせいする可能かのうせい指摘してきされている。

文字種もじしゅ 編集へんしゅう

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 古代こだい文字もじ、3にふくまれない漢字かんじ       だい3・だい4水準すいじゅん漢字かんじ一部いちぶ

バイトじゅんマークの使用しよう 編集へんしゅう

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()関数かんすう実行じっこう失敗しっぱいする原因げんいんとなる。HLSLGLSLシェーダープログラムコンパイラ(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]

脚注きゃくちゅう 編集へんしゅう

  1. ^ RFC 3629 UTF-8, a transformation format of ISO 10646
  2. ^ RFC 3629 Page-3
  3. ^ Rob Pike's UTF-8 history
  4. ^ ISO/IEC 10646:2003 Information technology -- Universal Multiple-Octet Coded Character Set (UCS)
  5. ^ RFC 2279 UTF-8, a transformation format of ISO 10646
  6. ^ The Unicode Standard, Version 5.2
  7. ^ RFC 3629 UTF-8, a transformation format of ISO 10646
  8. ^ ただし、バイトじゅんマーク (BOM) が付加ふかされている場合ばあいや、テキストを7ビットで処理しょりするソフトウェア、内部ないぶてきさい上位じょういビットを使用しようしているソフトウェアなど、使つかえないものも存在そんざいする
  9. ^ RFC 3629, pp.9f.
  10. ^ 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にち閲覧えつらん
  11. ^ Windowsにおける有名ゆうめいワームであるNimdaウイルスは、IISにおけるUTF-8の脆弱ぜいじゃくせいをもちいたものである。(はせがわようすけ 2009)
  12. ^ Mark Davis. “Forms of Unicode” (英語えいご). IBM. 2005ねん5がつ6にち時点じてんオリジナルよりアーカイブ。2013ねん9がつ18にち閲覧えつらん
  13. ^ このため、UTF-8という使つかっていれば情報じょうほう交換こうかん相手あいて文書ぶんしょ先頭せんとうにこのシーケンスがあるとなすと期待きたいすべきではないし、また、UTF-8Nという情報じょうほう交換こうかんさいもちいるべきではない。
  14. ^ TeraPadEmEditorMIFESのようにBOMを付加ふかするかどうかを選択せんたくできるものもある。
  15. ^ マイクロソフト・サポート https://support.microsoft.com/en-us/office/opening-csv-utf-8-files-correctly-in-excel-8a935af5-3416-4edd-ba7e-3dfd2bc4a032
  16. ^ /source-charset (Set Source Character Set) | Microsoft Docs
  17. ^ 「メモちょう」に多数たすう改善かいぜん、BOMなしUTF-8がデフォルト保存ほぞん形式けいしきに ~「Windows 10 19H1」”. Impress. 2023ねん1がつ26にち閲覧えつらん
  18. ^ RFC 3629 6. Byte order mark (BOM)

参考さんこう資料しりょう 編集へんしゅう

関連かんれん項目こうもく 編集へんしゅう