エンコーディング

現行標準 — 最終更新

参加方法:
GitHub whatwg/encoding新しい issueオープン中の issue
Matrix でチャット
コミット:
GitHub whatwg/encoding/commits
このコミット時点のスナップショット
@encodings
テスト:
web-platform-tests encoding/進行中の作業
翻訳 (参考訳):
日本語
简体中文
한국어

概要

エンコーディング標準は、エンコーディングおよびその JavaScript API を定義します。

1. まえがき

UTF-8エンコーディングは、ユニバーサル符号化文字集合であるUnicodeの交換に最も適したエンコーディングです。そのため、新しいプロトコルやフォーマット、または新しいコンテキストで展開される既存のフォーマットにおいても、本仕様はUTF-8エンコーディングを要求し(また定義し)ます。

その他の(レガシー)エンコーディングは、過去にある程度定義されていました。しかし、ユーザーエージェントは必ずしもそれらを同じ方法で実装しておらず、同じラベルを使用しているわけでもなく、未定義や旧来の独自領域の扱いも異なっていました。本仕様はそれらのギャップを埋めることで、新しいユーザーエージェントがエンコーディングの実装をリバースエンジニアリングする必要がなくなり、既存のユーザーエージェントも収束できるようにしています。

特に、本仕様はすべてのエンコーディング、それらのバイトからスカラー値への変換アルゴリズムおよびその逆、そして正規名や識別ラベルを定義しています。また、エンコーディングアルゴリズムの一部をJavaScriptに公開するAPIも定義しています。

ユーザーエージェントは、IANA Character Setsレジストリに記載されているラベルからも大きく逸脱してきました。 レガシーエンコーディングのさらなる拡散を防ぐためにも、本仕様はこれらの詳細について網羅的に記述しており、レジストリを必要としません。特に、本仕様ではエンコーディングのあらゆる側面を拡張する仕組みを提供しません。

2. セキュリティの背景

プロデューサーとコンシューマーが使用中のエンコーディングやその実装方法について合意していない場合、エンコーディングに関するセキュリティ問題が発生します。例えば、2011年に報告された攻撃の一例では、Shift_JISのリーディングバイト0x82が、攻撃者が管理できるJSONリソースのフィールド内で0x22のトレイリングバイトを「マスク」するために使われました。 プロデューサーは、この組み合わせが不正なバイトであるにもかかわらず問題に気付かず、コンシューマーはそれを単一のU+FFFD(�)としてデコードし、U+0022(")が重要なデリミタであるため解釈全体が変わってしまいました。 スカラー値を表すのに複数バイトを使用するエンコーディングのデコーダーは、今では不正なバイトの組み合わせが発生した場合、U+0000からU+007Fまでの範囲のスカラー値が「マスク」されないことを要求しています。前述のシーケンスの場合、出力はU+FFFD U+0022となります。(ただし、gb18030デコーダーだけは、キューの終端で1バイトだけこのようなバイトを「マスク」します。)

リーディングバイトが存在しない場合、ASCIIバイトをASCIIコードポイント以外にマップするエンコーディングでは、より大きな問題になります。これらは「ASCII非互換」エンコーディングと呼ばれ、ISO-2022-JPUTF-16BE/LEのように展開済みコンテンツのために必要なもの以外はサポートされていません。(その他のエンコーディングもより多くのラベルをreplacementエンコーディングにマッピングできないか調査中です。未知のエンコーディングフォールバックの代わりに。) 例えば、巧妙に作成されたコンテンツをリソースに挿入し、ユーザーにエンコーディングの上書きを促すことで、スクリプトの実行などを引き起こす攻撃があります。

HTMLやHTMLのフォーム機能で使われるURL用エンコーダーも、すべてのスカラー値を表現できないエンコーディングが使われた場合、若干の情報損失が発生することがあります。例えば、windows-1252エンコーディングを使用しているリソースでは、サーバーはエンドユーザーが「💩」と「💩」のどちらをフォームに入力したか区別できません。

ここで挙げられた問題は、UTF-8のみを排他的に使用することで解消されます。これが、すべてにおいてUTF-8を必須エンコーディングとした多くの理由の一つです。

詳細はブラウザーUIの章も参照してください。

3. 用語集

本仕様はInfra標準に依存しています。[INFRA]

16進数は"0x"で始まります。

数式では、すべての数値は整数であり、加算は「+」、減算は「−」、乗算は「×」、整数の除算は「/」(商を返す)、剰余は「%」(整数除算の余りを返す)、論理左シフトは「<<」、論理右シフトは「>>」、ビットごとのANDは「&」、ビットごとのORは「|」で表されます。

論理右シフトの被演算子は、少なくとも21ビットの精度を持っている必要があります。


I/Oキューは、特定の型(つまりバイトスカラー値)のリストです。 キュー終端は、任意の型の要素としてI/Oキューに存在しうる特別な要素であり、キュー内にこれ以上要素が無いことを示します。

I/Oキューの利用方法は2つあります:即時モードではメモリ内のI/Oデータを表し、ストリーミングモードではネットワークから到着するデータを表します。即時キューは、最後の要素がキュー終端となりますが、ストリーミングキューは必ずしもそうとは限らず、そのため読み取り操作がブロックされることがあります。

ストリーミングI/Oキューは空で作成され、ネットワークからデータが到着するたびに新しい要素プッシュされることが期待されます。基盤となるネットワークストリームが閉じられると、キュー終端要素がキューにプッシュされます。

ストリーミングI/Oキューからの読み取りはブロックされる可能性があるため、ストリーミングI/Oキューイベントループからは使用しないでください。代わりに並列で使用してください。

読み取りのために、要素I/OキューioQueueから読み取るには、次の手順を実行します:

  1. もしioQueueなら、そのサイズが1以上になるまで待機します。

  2. もしioQueue[0]がキュー終端なら、キュー終端を返します。

  3. 削除し、ioQueue[0]を返します。

読み取りによって、number個の要素ioQueueから取得するには、次の手順を実行します:

  1. readItemsを« »とする。

  2. 次のステップをnumber回繰り返す:

    1. 追加し、readItems読み取りで得た要素を加える。

  3. 削除し、readItemsからキュー終端を除く。

  4. readItemsを返す。

ピークにより、number個の要素I/OキューioQueueから取得するには、次の手順を実行します:

  1. いずれか早い方まで待機する:ioQueueサイズnumber以上になる、またはioQueueキュー終端を含む。

  2. prefixを« »とする。

  3. nについて、範囲1からnumberまで実行する:

    1. もしioQueue[n]がキュー終端なら、breakする。

    2. それ以外の場合、追加し、ioQueue[n]をprefixに加える。

  4. prefixを返す。

プッシュのために、要素itemI/OキューioQueueに追加するには、次の手順を実行します:

  1. もしioQueueの最後の要素キュー終端なら:

    1. もしitemキュー終端なら、何もしない。

    2. それ以外の場合、挿入し、itemioQueueの最後の要素の前に追加する。

  2. それ以外の場合、追加し、itemioQueueに加える。

プッシュにより、アイテム列をI/OキューioQueueに追加するとは、指定された順序で各アイテムをioQueueにプッシュすることです。

復元のために、要素(ただしキュー終端を除く)をI/Oキューに復元するには、リスト前置操作を行ってください。復元によって、リスト要素、キュー終端を除く)をI/Oキューに復元するには、指定された順序でキュー先頭に挿入します。

バイト « 0xF0, 0x9F » をI/Oキュー « 0x92 0xA9, キュー終端 » に挿入すると、I/Oキューは« 0xF0, 0x9F, 0x92 0xA9, キュー終端 » となります。次に読み取られる要素は0xF0です。

変換のために、I/OキューioQueueリスト文字列、またはバイト列に変換するには、読み取りで不定個数の要素ioQueueから取得した結果を返します。

変換のために、リスト文字列、またはバイト列inputI/Oキューに変換するには、次の手順を実行します:

  1. アサートinputリストでない、またはキュー終端を含まないこと。

  2. input内の要素を順に含み、続けてキュー終端を含むI/Oキューを返します。

Infra標準で型変換に関するインフラが定義される予定です。 whatwg/infra issue #319も参照。[INFRA]

I/Oキューリストとして定義されており、キューではありません。これは復元操作を持つためですが、この復元操作は本仕様のアルゴリズム内部の詳細であり、他の標準で使うものではありません。実装では、実装上の注意事項に記載の通り、こうしたアルゴリズムを別の方法で実装しても構いません。


サロゲートからスカラー値を得るには、リーディングサロゲートleadingトレーリングサロゲートtrailingが与えられたとき、0x10000 + ((leading − 0xD800) << 10) + (trailing − 0xDC00) を返します。


Uint8Arrayオブジェクトを作成するには、I/OキューioQueuerealmrealmが与えられたとき:

  1. 変換ioQueueをバイト列に変換し、それをbytesとする。

  2. 作成で、Uint8Arrayオブジェクトをrealm内のbytesから作成し、それを返す。

4. エンコーディング

エンコーディングは、スカラー値列とバイト列との間の対応付け(およびその逆)を定義します。各エンコーディングには名前および1つ以上のラベルがあります。

本仕様は、Unicode標準で定義されているエンコーディングスキームと同じ名前を持つ3つのエンコーディングUTF-8UTF-16LEUTF-16BE)を定義しています。エンコーディングは、バイト順マーク(BOM)の扱いがエンコーディング自体の一部ではなく、本仕様のラッパーアルゴリズムの一部である点で、Unicode標準のエンコーディングスキームと異なります。UTF-8UTF-8デコードアルゴリズムを組み合わせることで、同名のエンコーディングスキームと一致します。 本仕様は、UTF-16LEおよびUTF-16BEを同様にラップするアルゴリズムは提供しません。[UNICODE]

4.1. エンコーダーとデコーダー

エンコーディングには対応するデコーダーがあり、多くの場合は対応するエンコーダーもあります。デコーダーエンコーダーのインスタンスは、ハンドラアルゴリズムを持ち、また状態を持つ場合もあります。ハンドラアルゴリズムは、入力のI/Oキュー要素を受け取り、終端、1個以上の要素エラー(任意で符号位置付き)、または継続のいずれかを返します。

replacementおよびUTF-16BE/LEエンコーディングには エンコーダーはありません。

以下で使われるエラーモードは、デコーダーの場合は"replacement"または"fatal"、エンコーダーの場合は"fatal"または"html"となります。

XMLプロセッサはエラーモードを"fatal"に設定します。 [XML]

"html"は、HTMLフォームが終了しないレガシーエンコーダーを必要とするため、エラーモードとして存在します。"html"エラーモードは、正当な入力と区別できないシーケンスを出力し、サイレントなデータ損失につながる可能性があります。開発者はこれを防ぐため、UTF-8エンコーディングを使用することが強く推奨されます。 [HTML]


キューを処理するには、エンコーディングデコーダーまたはエンコーダーインスタンスencoderDecoderI/OキューinputI/Oキューoutputエラーモードmodeが与えられたとき、次の手順を実行します:

  1. trueの間、以下を繰り返す:

    1. resultを、要素を処理する読み取りinputから取得した値、encoderDecoderinputoutputmode)の結果とする。

    2. result継続でなければ、resultを返す。

要素を処理するには、要素itemエンコーディングエンコーダーまたはデコーダーインスタンスencoderDecoderI/OキューinputI/Oキューoutputエラーモードmodeが与えられたとき、次の手順を実行します:

  1. アサートencoderDecoderエンコーダーインスタンスでない、またはmodeが"replacement"でない。

  2. アサートencoderDecoderデコーダーインスタンスでない、またはmodeが"html"でない。

  3. アサートencoderDecoderエンコーダーインスタンスでない、またはitemサロゲートでない。

  4. resultを、encoderDecoderハンドラinputitemを渡して実行した結果とする。

  5. もしresult終端なら:

    1. プッシュキュー終端outputに追加する。

    2. resultを返す。

  6. それ以外で、resultが1個以上の要素の場合:

    1. アサートencoderDecoderデコーダーインスタンスでない、またはresultサロゲートが含まれていない。

    2. プッシュresultoutputに追加する。

  7. それ以外で、resultエラーの場合は、modeに応じて次の処理を行う:

    "replacement"
    プッシュでU+FFFD (�) をoutputに追加する。
    "html"
    プッシュで0x26 (&), 0x23 (#)およびresult符号位置の10進値を表す0x30 (0)〜0x39 (9)の最短列、その後0x3B (;)をoutputに追加する。
    "fatal"
    resultを返す。
  8. 継続を返す。

4.2. 名前とラベル

下表は、すべてのエンコーディングおよびユーザーエージェントがサポートしなければならないラベルを示します。ユーザーエージェントは、他のエンコーディングラベルをサポートしてはなりません。

各エンコーディングについて、そのASCII小文字化した名前が、そのラベルの1つとなります。

著者はUTF-8 エンコーディングを使用し、その識別には(ASCII大文字小文字を区別しない)"utf-8"ラベルを使用しなければなりません。

新しいプロトコルやフォーマット、ならびに新しいコンテキストで展開される既存のフォーマットは、UTF-8 エンコーディングのみを使用しなければなりません。これらのプロトコルやフォーマットがエンコーディング名前ラベルを公開する必要がある場合、それは"utf-8"として公開しなければなりません。

エンコーディングを取得する には、文字列labelが与えられたとき、次の手順を実行します:

  1. labelの先頭および末尾からASCII空白をすべて除去する。

  2. もしlabelが下表のいずれかのラベルとASCII大文字小文字を区別しない一致をする場合は、対応するエンコーディングを返す。そうでなければ失敗を返す。

これは、エンコーディングへのラベルのマッピングとして、 Unicode技術標準#22の1.4節が定めるものよりも基本的かつ制限の強いアルゴリズムです。これは現行コンテンツとの互換性のために必要です。

名前 ラベル
エンコーディング
UTF-8 "unicode-1-1-utf-8"
"unicode11utf8"
"unicode20utf8"
"utf-8"
"utf8"
"x-unicode20utf8"
レガシー単一バイトエンコーディング
IBM866 "866"
"cp866"
"csibm866"
"ibm866"
ISO-8859-2 "csisolatin2"
"iso-8859-2"
"iso-ir-101"
"iso8859-2"
"iso88592"
"iso_8859-2"
"iso_8859-2:1987"
"l2"
"latin2"
ISO-8859-3 "csisolatin3"
"iso-8859-3"
"iso-ir-109"
"iso8859-3"
"iso88593"
"iso_8859-3"
"iso_8859-3:1988"
"l3"
"latin3"
ISO-8859-4 "csisolatin4"
"iso-8859-4"
"iso-ir-110"
"iso8859-4"
"iso88594"
"iso_8859-4"
"iso_8859-4:1988"
"l4"
"latin4"
ISO-8859-5 "csisolatincyrillic"
"cyrillic"
"iso-8859-5"
"iso-ir-144"
"iso8859-5"
"iso88595"
"iso_8859-5"
"iso_8859-5:1988"
ISO-8859-6 "arabic"
"asmo-708"
"csiso88596e"
"csiso88596i"
"csisolatinarabic"
"ecma-114"
"iso-8859-6"
"iso-8859-6-e"
"iso-8859-6-i"
"iso-ir-127"
"iso8859-6"
"iso88596"
"iso_8859-6"
"iso_8859-6:1987"
ISO-8859-7 "csisolatingreek"
"ecma-118"
"elot_928"
"greek"
"greek8"
"iso-8859-7"
"iso-ir-126"
"iso8859-7"
"iso88597"
"iso_8859-7"
"iso_8859-7:1987"
"sun_eu_greek"
ISO-8859-8 "csiso88598e"
"csisolatinhebrew"
"hebrew"
"iso-8859-8"
"iso-8859-8-e"
"iso-ir-138"
"iso8859-8"
"iso88598"
"iso_8859-8"
"iso_8859-8:1988"
"visual"
ISO-8859-8-I "csiso88598i"
"iso-8859-8-i"
"logical"
ISO-8859-10 "csisolatin6"
"iso-8859-10"
"iso-ir-157"
"iso8859-10"
"iso885910"
"l6"
"latin6"
ISO-8859-13 "iso-8859-13"
"iso8859-13"
"iso885913"
ISO-8859-14 "iso-8859-14"
"iso8859-14"
"iso885914"
ISO-8859-15 "csisolatin9"
"iso-8859-15"
"iso8859-15"
"iso885915"
"iso_8859-15"
"l9"
ISO-8859-16 "iso-8859-16"
KOI8-R "cskoi8r"
"koi"
"koi8"
"koi8-r"
"koi8_r"
KOI8-U "koi8-ru"
"koi8-u"
macintosh "csmacintosh"
"mac"
"macintosh"
"x-mac-roman"
windows-874 "dos-874"
"iso-8859-11"
"iso8859-11"
"iso885911"
"tis-620"
"windows-874"
windows-1250 "cp1250"
"windows-1250"
"x-cp1250"
windows-1251 "cp1251"
"windows-1251"
"x-cp1251"
windows-1252

歴史的な「Latin1」や「ASCII」概念との関係については、下記を参照してください。

"ansi_x3.4-1968"
"ascii"
"cp1252"
"cp819"
"csisolatin1"
"ibm819"
"iso-8859-1"
"iso-ir-100"
"iso8859-1"
"iso88591"
"iso_8859-1"
"iso_8859-1:1987"
"l1"
"latin1"
"us-ascii"
"windows-1252"
"x-cp1252"
windows-1253 "cp1253"
"windows-1253"
"x-cp1253"
windows-1254 "cp1254"
"csisolatin5"
"iso-8859-9"
"iso-ir-148"
"iso8859-9"
"iso88599"
"iso_8859-9"
"iso_8859-9:1989"
"l5"
"latin5"
"windows-1254"
"x-cp1254"
windows-1255 "cp1255"
"windows-1255"
"x-cp1255"
windows-1256 "cp1256"
"windows-1256"
"x-cp1256"
windows-1257 "cp1257"
"windows-1257"
"x-cp1257"
windows-1258 "cp1258"
"windows-1258"
"x-cp1258"
x-mac-cyrillic "x-mac-cyrillic"
"x-mac-ukrainian"
レガシー多バイト中国語(簡体字)エンコーディング
GBK "chinese"
"csgb2312"
"csiso58gb231280"
"gb2312"
"gb_2312"
"gb_2312-80"
"gbk"
"iso-ir-58"
"x-gbk"
gb18030 "gb18030"
レガシー多バイト中国語(繁体字)エンコーディング
Big5 "big5"
"big5-hkscs"
"cn-big5"
"csbig5"
"x-x-big5"
レガシー多バイト日本語エンコーディング
EUC-JP "cseucpkdfmtjapanese"
"euc-jp"
"x-euc-jp"
ISO-2022-JP "csiso2022jp"
"iso-2022-jp"
Shift_JIS "csshiftjis"
"ms932"
"ms_kanji"
"shift-jis"
"shift_jis"
"sjis"
"windows-31j"
"x-sjis"
レガシー多バイト韓国語エンコーディング
EUC-KR "cseuckr"
"csksc56011987"
"euc-kr"
"iso-ir-149"
"korean"
"ks_c_5601-1987"
"ks_c_5601-1989"
"ksc5601"
"ksc_5601"
"windows-949"
レガシーその他のエンコーディング
replacement "csiso2022kr"
"hz-gb-2312"
"iso-2022-cn"
"iso-2022-cn-ext"
"iso-2022-kr"
"replacement"
UTF-16BE "unicodefffe"
"utf-16be"
UTF-16LE "csunicode"
"iso-10646-ucs-2"
"ucs-2"
"unicode"
"unicodefeff"
"utf-16"
"utf-16le"
x-user-defined "x-user-defined"

すべてのエンコーディングとそのラベルは、非規範的リソースであるencodings.jsonとしても利用できます。

サポートされるエンコーディングのセットは、標準の策定開始時点で主要なブラウザーエンジンがサポートしていたセットの共通部分を主な根拠としつつ、正当な用途がほとんどないが攻撃に使われるおそれのあるエンコーディングを除外する形で構成されています。既存Webコンテンツでの利用状況に関する逸話的証拠を踏まえると、一部のエンコーディングの収録には疑問が残ります。つまり、ブラウザーで広くサポートされてきた一方で、Webコンテンツ側で広く使われているかは不明です。しかし、ブラウザーで広くサポートされていた、またはISO 8859シリーズの一部である単一バイトエンコーディングについて、積極的に除去する試みは行われていません。特に、既存コンテンツ対応としてIBM866macintoshx-mac-cyrillicISO-8859-3ISO-8859-10ISO-8859-14ISO-8859-16の必要性は疑問視されているものの、これらを除去する計画はありません。

windows-1252 エンコーディングには、"latin1"、"iso-8859-1"、"ascii"など、開発者を混乱させてきた様々なラベルがあります。Web上、および本仕様を実装してWeb互換を目指すソフトウェアにおいて、これらはすべて同義語です:"latin1"や"ascii"は単なるwindows-1252のラベルであり、本仕様に準拠したソフトウェアは、たとえば「Latin1」や「ASCII」デコードを要求されたとき、そのバイト0x80をU+20AC (€)としてデコードします。

この仕様に従わないソフトウェアは、常に同じ動作をするとは限りません。その根本は、元々Latin1(ISO/IEC 8859-1)を規定した文書に、0x00~0x1Fや0x7F~0x9Fの範囲に関するマッピングがなかったこと、またASCII(ISO/IEC 646など)を規定した文書にも0x80~0xFFの範囲のマッピングがなかったことにあります。そのため、Latin1やASCIIエンコーディングを使うよう指示された場合、ソフトウェアごとにそれらバイトの符号位置割当が異なる場合があります。Webブラウザーやブラウザー互換ソフトウェアは、それらのバイトをwindows-1252に従って割り当てており、これは両者の上位互換であり、この選択が本仕様で規定されました。他のソフトウェアでは、エラーとしたり、等値復号など他のマッピングを使ったりします。[ISO8859-1] [ISO646]

このため、実装者や開発者は「Latin1」や「ASCII」といったAPIを公開するライブラリーを利用する際には注意が必要です。元仕様で未定義だったバイトに対して異なる動作を選択している場合、本仕様と一致しない結果になる可能性があります。

4.3. 出力エンコーディング

出力エンコーディングを取得するには、エンコーディングencodingが与えられたとき、次の手順を実行します:

  1. もしencodingreplacementまたはUTF-16BE/LEなら、UTF-8を返す。

  2. encodingを返す。

出力エンコーディングを取得するアルゴリズムは、URL解析やHTMLフォーム送信のように、まさにこの処理が必要となる場面で役立ちます。

5. 索引

ほとんどのレガシーエンコーディングは、索引を使用します。索引とは、各エントリーがポインタと対応する符号位置から成る順序付きリストです。索引内ではポインタは一意で、符号位置は重複してもかまいません。

効率的な実装では、1つのエンコーディングごとに、デコーダー用とエンコーダー用の2つの索引を持つことが多いでしょう。

索引内のポインタと対応する符号位置を探すには、リソースの内容をU+000A LFで分割したものをlinesとする。その後、空文字列またはU+0023(#)で始まるlines内の各項目を削除する。各linesの項目をU+0009 TABで分割し、最初のサブ項目がポインタ(10進数)、2番目が対応する符号位置(16進数)となる。他のサブ項目は関係ありません。

変更を示すため、索引にはIdentifierDateが含まれます。Identifierが変更されていれば、その索引も変更されています。

index内のpointerに対応する索引符号位置は、index内のpointerに対応する符号位置、またはpointerindexにない場合はnullです。

index内のcodePointに対応する索引ポインタは、index内でcodePointに対応する最初のポインタ、またはcodePointindexにない場合はnullです。

索引gb18030範囲索引およびISO-2022-JPカタカナ索引を除く)ごとに、非規範的な可視化があります。jis0208索引には、別のShift_JIS可視化もあります。また、gb18030範囲索引ISO-2022-JPカタカナ索引以外の各索引について、基本多言語面カバレッジの可視化もあります。

可視化の凡例は以下の通りです:

以下は、この仕様で定義されている索引単一バイト索引を除く。そちらは別表)の一覧です。

索引 備考
Big5索引 index-big5.txt Big5索引可視化 Big5索引BMPカバレッジ これはBig5標準と香港補助文字セットおよびその他の一般的な拡張を組み合わせたものに一致します。
EUC-KR索引 index-euc-kr.txt EUC-KR索引可視化 EUC-KR索引BMPカバレッジ これはKS X 1001標準およびUnified Hangul Code(通称Windowsコードページ949)に一致します。Unicodeのハングル音節ブロック全体をカバーします。ビジュアライゼーションで左上がポインタ9026のブロックはUnicode順です。それ以外のハングル音節もUnicode順です。
gb18030索引 index-gb18030.txt gb18030索引可視化 gb18030索引BMPカバレッジ 二バイトでエンコードされる符号位置について、GB18030-2022標準に一致します(ただし0xA3 0xA0は、実コンテンツとの互換性のためU+3000(IDEOGRAPHIC SPACE)へマップ)。この索引はUnicodeのCJK統合漢字ブロック全体をカバーします。そのブロックでビジュアライゼーション上U+3000より上または左にあるエントリはUnicode順です。
gb18030範囲索引 index-gb18030-ranges.txt この索引は他と動作が異なります。すべての符号位置を列挙すると100万件を超えるため、207範囲と単純な範囲チェックで表現しています。したがって、GB18030-2000標準の4バイト符号位置とは厳密に一致しません。GB18030-2005改訂の変更は、下記のgb18030範囲索引符号位置およびgb18030範囲索引ポインタアルゴリズムで扱います。2022年改訂の変更は、私用領域へのバイト列割当がこれ以上増えないよう別の方法で扱い、該当する私用領域符号位置はgb18030エンコーダーがサイドテーブルで直接処理します。
jis0208索引 index-jis0208.txt jis0208索引可視化, Shift_JIS可視化 jis0208索引BMPカバレッジ JIS X 0208標準にIBMとNECの旧独自拡張を含みます。
jis0212索引 index-jis0212.txt jis0212索引可視化 jis0212索引BMPカバレッジ JIS X 0212標準です。他で広くサポートされていないため、EUC-JPデコーダーでのみ使われます。
ISO-2022-JPカタカナ索引 index-iso-2022-jp-katakana.txt これはUnicode正規化形式KCに基づき、半角カタカナを全角カタカナにマップします。ただしU+FF9E(゙)、U+FF9F(゚)はU+309B(゛)、U+309C(゜)へ(U+3099, U+309Aではなく)マップされます。ISO-2022-JPエンコーダーでのみ使われます。[UNICODE]

gb18030範囲索引符号位置pointer用)は次の手順で求まります:

  1. pointerが39419より大きくかつ189000未満、または1237575より大きい場合はnullを返す。

  2. pointerが7457の場合、符号位置U+E7C7を返す。

  3. offsetを、gb18030範囲索引pointer以下の最後のポインタとし、codePointOffsetをその対応符号位置とする。

  4. codePointOffset + pointeroffsetという値の符号位置を返す。

gb18030範囲索引ポインタcodePoint用)は次の手順で求まります:

  1. codePointがU+E7C7の場合、ポインタ7457を返す。

  2. offsetを、gb18030範囲索引codePoint以下の最後の符号位置とし、pointerOffsetをその対応ポインタとする。

  3. pointerOffset + codePointoffsetという値のポインタを返す。

Shift_JIS索引ポインタcodePoint用)は次の手順で求まります:

  1. indexを、ポインタ8272~8835(含む)のエントリを除いたjis0208索引とする。

    jis0208索引には重複符号位置があるため、これらの除外により後ろの符号位置が使われます。

  2. index内のcodePointに対する索引ポインタを返す。

Big5索引ポインタcodePoint用)は次の手順で求まります:

  1. indexを、ポインタが(0xA1 - 0x81) × 157未満のエントリを除いたBig5索引とする。

    香港補助文字セット拡張をそのまま返すのを避けます。

  2. codePointがU+2550 (═)、U+255E (╞)、U+2561 (╡)、U+256A (╪)、U+5341 (十)、U+5345 (卅)の場合、index内でcodePointに対応する最後のポインタを返す。

    他にも重複符号位置はありますが、それらは最初のポインタを使います。

  3. index内のcodePointに対する索引ポインタを返す。


すべての索引は、非規範的リソースindexes.jsonとしても利用できます。(gb18030範囲索引は、範囲を表現するため少し異なるフォーマットです。)

6. 標準へのフック

以下で定義されるアルゴリズム(UTF-8デコードBOMなしUTF-8デコードBOMなしエラー時失敗UTF-8デコードUTF-8エンコード)は他の標準が利用することを意図しています。

デコードには、新しいフォーマットではUTF-8デコードを使用してください。フォーマットやプロトコル内の識別子やバイト列には、BOMなしUTF-8デコードBOMなしエラー時失敗UTF-8デコードを使用してください。

エンコードには、UTF-8エンコードを使用してください。

標準は、UTF-8エンコード(およびレガシーエンコード)に渡す入力I/Oキューが実質的にスカラー値のI/Oキュー(すなわちサロゲートを含まない)であることを保証してください。

これらのフック(およびデコードエンコード)は、入力I/Oキューがすべて消費されるまでブロックされます。ストリームに出力トークンがプッシュされるたびにそれを利用したい場合は、呼び出し元は空の出力I/Oキューでフックを呼び、並列でそれを読み取ってください。なおBOMなしエラー時失敗UTF-8デコードの利用時は注意が必要で、デコード中にエラーが発生した場合、出力I/Oキューに キュー終端要素がプッシュされなくなります。

UTF-8デコードを、バイトのI/OキューioQueueに対して(オプションでスカラー値のI/Oキューoutput(デフォルトは« »)付き)行うには、次の手順を実行します:

  1. bufferを、ピークioQueueから3バイト取得し、バイト列に変換したものとする。

  2. もしbufferが0xEF 0xBB 0xBFなら、読み取りioQueueから3バイト読み取る(これらのバイトは何もしない)。

  3. キューを処理するを、UTF-8デコーダーインスタンス、ioQueueoutput、"replacement"で実行する。

  4. outputを返す。

BOMなしUTF-8デコードを、バイトのI/OキューioQueueに対して(オプションでスカラー値のI/Oキューoutput(デフォルトは« »)付き)行うには、次の手順を実行します:

  1. キューを処理するを、UTF-8デコーダーインスタンス、ioQueueoutput、"replacement"で実行する。

  2. outputを返す。

BOMなしエラー時失敗UTF-8デコードを、バイトのI/OキューioQueueに対して(オプションでスカラー値のI/Oキューoutput(デフォルトは« »)付き)行うには、次の手順を実行します:

  1. potentialErrorを、キューを処理するUTF-8デコーダーインスタンス、ioQueueoutput、"fatal")の結果とする。

  2. もしpotentialErrorエラーなら、失敗を返す。

  3. outputを返す。


UTF-8エンコードを、スカラー値のI/OキューioQueueに対して(オプションでバイトのI/Oキューoutput(デフォルトは« »)付き)行うには、エンコードioQueueをエンコーディングUTF-8およびoutputでエンコードした結果を返します。

6.1. レガシー標準フック

標準では、互換性のため以外は、デコードBOM判別エンコードを使うことは強く推奨されません。これらレガシーフックが必要な標準は、(ラベルをエンコーディングに変換するための)エンコーディングを取得するや、(エンコーディングエンコードに渡すのに適した別のエンコーディングに変換するための)出力エンコーディングを取得するも必要になるでしょう。

URLパーセントエンコーディングという極めてニッチなケースでは、カスタムエンコーダーのエラー処理が必要です。その場合はエンコーダー取得失敗時エンコードアルゴリズムを使用してください。その他のアルゴリズムは直接使用しないでください。

デコードを、バイトのI/OキューioQueue、フォールバックエンコーディングencoding、(オプションでスカラー値のI/Oキューoutput(デフォルトは« »)付き)で行うには、次の手順を実行します:

  1. BOMEncodingを、BOM判別ioQueueに対して実行した結果とする。

  2. もしBOMEncodingがnullでなければ:

    1. encodingBOMEncodingに設定する。

    2. もしBOMEncodingUTF-8ならioQueueから3バイト、そうでなければ2バイト読み取りする(これらのバイトは何もしない)。

    実コンテンツとの互換性のため、バイト順マークは他のどんな情報よりも優先されます。HTTPコンテキストではこれはContent-Typeヘッダーの意味論に反します。

  3. キューを処理するを、encodingデコーダーインスタンス、ioQueueoutput、"replacement"で実行する。

  4. outputを返す。

BOM判別をバイトのI/OキューioQueueに対して行うには、次の手順を実行します:

  1. BOMを、ピークioQueueから3バイト取得し、バイト列に変換したものとする。

  2. 下表の各行について、最初の行から順に、BOMが最初の列に示すバイトで始まる場合、その行2列目のエンコーディングを返す。そうでなければnullを返す。

    バイト順マーク エンコーディング
    0xEF 0xBB 0xBF UTF-8
    0xFE 0xFF UTF-16BE
    0xFF 0xFE UTF-16LE

このフックは、デコードがバイト順マーク発見時に呼び出し元に伝達できない問題の回避策です。このフックはデコードの前に呼び出され、バイト順マークが見つかった場合は対応するエンコーディングを、そうでなければnullを返します。


エンコードを、スカラー値のI/OキューioQueue、エンコーディングencoding、(オプションでバイトのI/Oキューoutput(デフォルトは« »)付き)で行うには、次の手順を実行します:

  1. encoderencodingからエンコーダー取得した結果とする。

  2. キューを処理するを、encoderioQueueoutput、"html"で実行する。

  3. outputを返す。

これはHTMLフォーム用のレガシーフックです。UTF-8エンコードを重ねても安全で、エラーが発生することはありません。[HTML]


エンコーダー取得をエンコーディングencodingencodingから行うには:

  1. アサートencodingreplacementまたはUTF-16BE/LEでないこと。

  2. encodingエンコーダーインスタンスを返す。

失敗時エンコードを、スカラー値のI/OキューioQueueencoderインスタンスencoder、バイトのI/Oキューoutputで行うには、次の手順を実行します:

  1. potentialErrorを、キューを処理するencoderioQueueoutput、"fatal")の結果とする。

  2. プッシュキュー終端outputに追加する。

  3. もしpotentialErrorエラーなら、error符号位置を返す。

  4. nullを返す。

これはURLパーセントエンコーディング用のレガシーフックです。呼び出し元はエンコーダーインスタンスを保持する必要があります。ISO-2022-JPエンコーダーは、エラーを返す際に2つの異なる状態を取りうるためです。また、エラーをエンコードするバイトを出力する場合、それらは0x00~0x7Fの範囲(0x0E, 0x0F, 0x1B, 0x5C, 0x7Eを除く)でなければなりません。[URL]

特に、エラー時にISO-2022-JPエンコーダーRoman状態にある場合、0x5C(\)は出力できません。これはU+005C(\)としてデコードされないためです。このため、失敗時エンコードを意図せず利用するアプリケーションは、U+005C(\)をリプレース構文(例:\u2603)に使うJavaScriptやCSSのようなリプレース構文と組み合わせてISO-2022-JPエンコーダーを利用しないようにするか、リプレース構文をエンコーダーに通すようにしてください(URLパーセントエンコーディングとは対照的に)。

戻り値は、エンコードできなかった符号位置を表す数値、またはエラーがなければnullです。非nullの場合、呼び出し元は同じエンコーダーインスタンスと新しいoutput I/Oキューで再度呼び出す必要があります。

7. API

この節ではWeb IDLの用語を使用します。ブラウザーのユーザーエージェントは本APIをサポートしなければなりません。JavaScript実装も本APIをサポートすることが推奨されます。他のユーザーエージェントやプログラミング言語は、自身の要件に合ったAPIを使用することが推奨されますが、それが本APIと同一である必要はありません。[WEBIDL]

次の例は、TextEncoder オブジェクトを使い、文字列配列をArrayBufferへエンコードするものです。結果はUint8Arrayで、最初に文字列数(Uint32Arrayとして)が入り、それに続き1つ目の文字列の長さ(Uint32Arrayとして)、そのUTF-8エンコード文字列データ、2つ目の長さ(Uint32Arrayとして)、その文字列データ、…という順になります。

function encodeArrayOfStrings(strings) {
  var encoder, encoded, len, bytes, view, offset;

  encoder = new TextEncoder();
  encoded = [];

  len = Uint32Array.BYTES_PER_ELEMENT;
  for (var i = 0; i < strings.length; i++) {
    len += Uint32Array.BYTES_PER_ELEMENT;
    encoded[i] = encoder.encode(strings[i]);
    len += encoded[i].byteLength;
  }

  bytes = new Uint8Array(len);
  view = new DataView(bytes.buffer);
  offset = 0;

  view.setUint32(offset, strings.length);
  offset += Uint32Array.BYTES_PER_ELEMENT;
  for (var i = 0; i < encoded.length; i += 1) {
    len = encoded[i].byteLength;
    view.setUint32(offset, len);
    offset += Uint32Array.BYTES_PER_ELEMENT;
    bytes.set(encoded[i], offset);
    offset += len;
  }
  return bytes.buffer;
}

次の例は、上記の形式でエンコードされたデータ(またはUTF-8以外の等価なアルゴリズムでエンコードされたデータ)を、ArrayBufferから配列の文字列にデコードします。

function decodeArrayOfStrings(buffer, encoding) {
  var decoder, view, offset, num_strings, strings, len;

  decoder = new TextDecoder(encoding);
  view = new DataView(buffer);
  offset = 0;
  strings = [];

  num_strings = view.getUint32(offset);
  offset += Uint32Array.BYTES_PER_ELEMENT;
  for (var i = 0; i < num_strings; i++) {
    len = view.getUint32(offset);
    offset += Uint32Array.BYTES_PER_ELEMENT;
    strings[i] = decoder.decode(
      new DataView(view.buffer, offset, len));
    offset += len;
  }
  return strings;
}

7.1. インターフェースミックスイン TextDecoderCommon

interface mixin TextDecoderCommon {
  readonly attribute DOMString encoding;
  readonly attribute boolean fatal;
  readonly attribute boolean ignoreBOM;
};

TextDecoderCommon インターフェースミックスインは、TextDecoder およびTextDecoderStream オブジェクト間で共有される共通のgetterを定義します。これらのオブジェクトは次のものを持ちます:

encoding
エンコーディング
decoder
デコーダーインスタンス。
I/Oキュー
バイトのI/Oキュー
BOM無視
真偽値。初期値はfalse。
BOM検出済み
真偽値。初期値はfalse。
エラーモード
エラーモード。初期値は"replacement"。

I/Oキューのシリアライズアルゴリズムは、TextDecoderCommon decoderとスカラー値のI/Oキュー ioQueueが与えられたとき、次の手順を実行します:

  1. outputを空文字列とする。

  2. trueの間、以下を繰り返す:

    1. itemを、読み取りioQueueから取得する。

    2. もしitemキュー終端であれば、outputを返す。

    3. decoderencodingUTF-8またはUTF-16BE/LEであり、かつdecoderBOM無視およびBOM検出済みがfalseのとき:

      1. decoderBOM検出済みをtrueに設定する。

      2. もしitemがU+FEFF BOMなら、continue

    4. itemoutputに追加する。

このアルゴリズムは、BOMの扱いに関しては他のプラットフォームで使われているデコードアルゴリズムと意図的に異なり、API利用者により多くの制御を提供します。


encoding getterの手順は、thisencoding名前ASCII小文字化して返すこと。

fatal getterの手順は、thisエラーモードが"fatal"ならtrue、そうでなければfalseを返すこと。

ignoreBOM getterの手順は、thisBOM無視を返すこと。

7.2. インターフェース TextDecoder

dictionary TextDecoderOptions {
  boolean fatal = false;
  boolean ignoreBOM = false;
};

dictionary TextDecodeOptions {
  boolean stream = false;
};

[Exposed=*]
interface TextDecoder {
  constructor(optional DOMString label = "utf-8", optional TextDecoderOptions options = {});

  USVString decode(optional AllowSharedBufferSource input, optional TextDecodeOptions options = {});
};
TextDecoder includes TextDecoderCommon;

TextDecoder オブジェクトには、do not flush(ブール値、初期値はfalse)が関連付けられています。

decoder = new TextDecoder([label = "utf-8" [, options]])

新しいTextDecoderオブジェクトを返します。

labelがラベルでない場合、またはreplacementラベルの場合、RangeError例外を投げます。

decoder . encoding

encoding名前(小文字)を返します。

decoder . fatal

エラーモードが"fatal"の場合はtrue、それ以外はfalseを返します。

decoder . ignoreBOM

BOM無視の値を返します。

decoder . decode([input [, options]])

encodingデコーダーを実行した結果を返します。optionsstreamがtrueでこのメソッドを0回以上呼び出し、その後optionsstreamがfalse(または省略)で1回だけ呼び出すことで、断片化された入力を処理できます。optionsstreamがfalse(または省略)かつinputも省略の場合は、両引数とも省略するのが最も明確です。

var string = "", decoder = new TextDecoder(encoding), buffer;
while(buffer = next_chunk()) {
  string += decoder.decode(buffer, {stream:true});
}
string += decoder.decode(); // end-of-queue

エラーモードが"fatal"でencodingデコーダーerrorを返した場合、TypeError例外を投げます。

new TextDecoder(label, options) コンストラクタの手順は以下の通りです:

  1. encodinglabelからエンコーディングを取得するで得る。

  2. encodingが失敗またはreplacementの場合、RangeError例外を投げる。

  3. thisencodingencodingに設定する。

  4. もしoptions["fatal"]がtrueなら、thisエラーモードを"fatal"に設定する。

  5. thisBOM無視options["ignoreBOM"]に設定する。

decode(input, options) メソッドの手順は以下の通りです:

  1. thisdo not flushがfalseなら、thisdecoderencodingデコーダーの新しいインスタンスに、thisI/OキューをバイトのI/Oキュー « キュー終端 » に、thisBOM検出済みをfalseに設定する。

  2. thisdo not flushoptions["stream"]に設定する。

  3. もしinputが与えられた場合、プッシュinputコピーthisI/Oキューに追加する。

    実装ではこのコピーを避ける戦略が強く推奨されます。その場合もinputの変更がdecode()の将来の呼び出しに影響しないように配慮してください。

    SharedArrayBuffer オブジェクトが公開するメモリーは、実装で一般的なプログラミング言語のメモリーモデルが要求するデータ競合のなさを保証しません。実装時には SharedArrayBuffer のメモリーへアクセスする際、適切な仕組みを利用してください。

  4. outputをスカラー値のI/Oキュー « キュー終端 » とする。

  5. trueの間、以下を繰り返す:

    1. item読み取りthisI/Oキューから取得する。

    2. もしitemキュー終端かつthisdo not flushがtrueなら、I/Oキューのシリアライズthisoutputで実行した結果を返す。

      ストリーミング動作は、キュー終端をここで処理せず、thisdo not flushをfalseにしないことで実現します。これにより、次回呼び出し時にもthisdecoderが新たにセットされず、状態が保持されます。

    3. それ以外の場合:

      1. result要素を処理するitemthisdecoderthisI/Oキューoutputthisエラーモード)の結果とする。

      2. もしresult終端なら、I/Oキューのシリアライズthisoutputで実行した結果を返す。

      3. それ以外でresulterrorなら、TypeError例外を投げる。

7.3. インターフェースミックスイン TextEncoderCommon

interface mixin TextEncoderCommon {
  readonly attribute DOMString encoding;
};

TextEncoderCommon インターフェースミックスインは、 TextEncoder およびTextEncoderStream オブジェクト間で共有される共通getterを定義します。

encoding getterの手順は"utf-8"を返すことです。

7.4. インターフェース TextEncoder

dictionary TextEncoderEncodeIntoResult {
  unsigned long long read;
  unsigned long long written;
};

[Exposed=*]
interface TextEncoder {
  constructor();

  [NewObject] Uint8Array encode(optional USVString input = "");
  TextEncoderEncodeIntoResult encodeInto(USVString source, [AllowShared] Uint8Array destination);
};
TextEncoder includes TextEncoderCommon;

TextEncoder オブジェクトにはlabel引数はありません。これはUTF-8のみをサポートするためです。また、どのエンコーダーもスカラー値のバッファリングを必要としないため、streamオプションもありません。


encoder = new TextEncoder()

新しいTextEncoderオブジェクトを返します。

encoder . encoding

"utf-8"を返します。

encoder . encode([input = ""])

UTF-8エンコーダーを実行した結果を返します。

encoder . encodeInto(source, destination)

sourceに対してUTF-8エンコーダーを実行し、その結果をdestinationに格納し、進捗状況を表すオブジェクトとして返します。そのオブジェクトではreadsourceの変換されたコード単位数、writtendestinationに書き込まれたバイト数です。

new TextEncoder() コンストラクタの手順は何もしないことです。

encode(input)メソッドの手順は以下の通りです:

  1. inputをスカラー値のI/Oキューに変換する。

  2. outputをバイトのI/Oキュー « キュー終端 » とする。

  3. trueの間、以下を繰り返す:

    1. item読み取りinputから取得する。

    2. resultを、要素を処理するitemUTF-8エンコーダーインスタンス、inputoutput、"fatal")の結果とする。

    3. アサートresulterrorでないこと。

      UTF-8エンコーダーerrorを返しません。

    4. もしresult終端なら、Uint8Arrayオブジェクトの作成outputthis関連レルムを与える)を返す。

encodeInto(source, destination) メソッドの手順は以下の通りです:

  1. readを0とする。

  2. writtenを0とする。

  3. encoderUTF-8エンコーダーのインスタンスとする。

  4. unusedをスカラー値のI/Oキュー « キュー終端 » とする。

    この後で呼び出すハンドラアルゴリズムはこの引数を必要としますが、UTF-8エンコーダーでは使用しません。

  5. sourceをスカラー値のI/Oキューに変換する。

  6. trueの間、以下を繰り返す:

    1. item読み取りsourceから取得する。

    2. resultencoderハンドラunuseditemを与える)で実行した結果とする。

    3. もしresult終端なら、break

    4. それ以外の場合:

      1. もしdestinationバイト長writtenresultのバイト数以上なら:

        1. もしitemがU+FFFFより大きければ、readに2を加える。

        2. それ以外はreadに1を加える。

        3. resultのバイトをdestinationstartingOffsetwrittenにして書き込む。

          上記SharedArrayBufferオブジェクトの警告を参照してください。

        4. writtenresultのバイト数を加える。

      2. そうでなければbreak

  7. «[ "read" → read, "written" → written ]» を返す。

encodeInto()メソッドは、既存のArrayBufferオブジェクトに文字列をエンコードするために使用できます。以下の詳細は読者への課題としますが、このメソッドの利用法の一例を示します:

function convertString(buffer, input, callback) {
  let bufferSize = 256,
      bufferStart = malloc(buffer, bufferSize),
      writeOffset = 0,
      readOffset = 0;
  while (true) {
    const view = new Uint8Array(buffer, bufferStart + writeOffset, bufferSize - writeOffset),
          {read, written} = cachedEncoder.encodeInto(input.substring(readOffset), view);
    readOffset += read;
    writeOffset += written;
    if (readOffset === input.length) {
      callback(bufferStart, writeOffset);
      free(buffer, bufferStart);
      return;
    }
    bufferSize *= 2;
    bufferStart = realloc(buffer, bufferStart, bufferSize);
  }
}

7.5. インターフェース TextDecoderStream

[Exposed=*]
interface TextDecoderStream {
  constructor(optional DOMString label = "utf-8", optional TextDecoderOptions options = {});
};
TextDecoderStream includes TextDecoderCommon;
TextDecoderStream includes GenericTransformStream;
decoder = new TextDecoderStream([label = "utf-8" [, options]])

新しいTextDecoderStream オブジェクトを返します。

もしlabelがラベルでないか、またはラベルであっても replacementのラベルである場合、RangeError例外をスローします。

decoder . encoding

encodingname(小文字)を返します。

decoder . fatal

エラーモードが"fatal"の場合true、それ以外はfalseを返します。

decoder . ignoreBOM

ignore BOMの値を返します。

decoder . readable

リーダブルストリームを返します。このストリームのチャンクencodingデコーダーwritable に書き込まれたチャンクに対して実行した結果の文字列です。

decoder . writable

ライト可能ストリームを返します。このストリームは AllowSharedBufferSource チャンクを受け付け、 それらをencodingデコーダーに通して readable で利用可能にします。

通常これはpipeThrough() メソッドを ReadableStream ソースに対して使って利用します。

var decoder = new TextDecoderStream(encoding);
byteReadable
  .pipeThrough(decoder)
  .pipeTo(textWritable);

もしエラーモードが"fatal"で encodingデコーダーerrorを返した場合、 readable およびwritable の両方が TypeError でエラー状態になります。

new TextDecoderStream(label, options) コンストラクタの手順は以下の通りです:

  1. encodinglabelからエンコーディングを取得するで得る。

  2. encodingが失敗またはreplacementの場合、RangeError例外を投げる。

  3. thisencodingencodingに設定する。

  4. もしoptions["fatal"]がtrueなら、thisエラーモードを"fatal"に設定する。

  5. thisBOM無視options["ignoreBOM"]に設定する。

  6. thisdecoderencodingデコーダーの新しいインスタンスに、thisI/Oキューを新しいI/Oキューに設定する。

  7. transformAlgorithmを、chunk引数を受け取り、チャンクのデコードとエンキューアルゴリズムをthischunkで実行するアルゴリズムとする。

  8. flushAlgorithmを、引数なしでフラッシュとエンキューアルゴリズムをthisで実行するアルゴリズムとする。

  9. transformStreamTransformStreamの新しいインスタンスとする。

  10. transformStreamtransformAlgorithmtransformAlgorithmflushAlgorithmflushAlgorithmにしてセットアップする。

  11. thistransformtransformStreamに設定する。

チャンクのデコードとエンキューアルゴリズムは、TextDecoderStreamオブジェクトdecoderchunkが与えられたとき、次の手順を実行します:

  1. bufferSourcechunkAllowSharedBufferSource変換した結果とする。

  2. プッシュbufferSourceコピーdecoderI/Oキューに追加する。

    上記SharedArrayBufferオブジェクトの警告を参照してください。

  3. outputをスカラー値のI/Oキュー « キュー終端 » とする。

  4. trueの間、以下を繰り返す:

    1. item読み取りdecoderI/Oキューから取得する。

    2. もしitemキュー終端なら:

      1. outputChunkI/Oキューのシリアライズdecoderoutputを与える)で得る。

      2. もしoutputChunkが空文字列でなければ、エンキューoutputChunkdecodertransformに追加する。

      3. リターンする。

    3. result要素を処理するitemdecoderdecoderdecoderI/Oキューoutputdecoderエラーモード)の結果とする。

    4. もしresulterrorなら、TypeError例外を投げる。

フラッシュとエンキューアルゴリズムは、入力ReadableStreamオブジェクトからデータの終端を処理します。TextDecoderStreamオブジェクトdecoderが与えられたとき、次の手順を実行します:

  1. outputをスカラー値のI/Oキュー « キュー終端 » とする。

  2. trueの間、以下を繰り返す:

    1. item読み取りdecoderI/Oキューから取得する。

    2. result要素を処理するitemdecoderdecoderdecoderI/Oキューoutputdecoderエラーモード)の結果とする。

    3. もしresult終端なら:

      1. outputChunkI/Oキューのシリアライズdecoderoutputを与える)で得る。

      2. もしoutputChunkが空文字列でなければ、エンキューoutputChunkdecodertransformに追加する。

      3. リターンする。

    4. それ以外でresulterrorなら、TypeError例外を投げる。

7.6. インターフェース TextEncoderStream

[Exposed=*]
interface TextEncoderStream {
  constructor();
};
TextEncoderStream includes TextEncoderCommon;
TextEncoderStream includes GenericTransformStream;

TextEncoderStream オブジェクトには次のものが関連付けられています:

エンコーダー
エンコーダーインスタンス。
リーディングサロゲート
nullまたはリーディングサロゲート。初期値はnull。

TextEncoderStream オブジェクトにはlabel引数はありません。これはUTF-8のみをサポートするためです。

encoder = new TextEncoderStream()

新しいTextEncoderStream オブジェクトを返します。

encoder . encoding

"utf-8"を返します。

encoder . readable

リーダブルストリームを返します。このストリームのチャンクUint8Array であり、 UTF-8エンコーダーwritable に書き込まれたチャンクに対して実行した結果です。

encoder . writable

ライト可能ストリームを返します。このストリームは文字列チャンクを受け取り、 UTF-8エンコーダーを通して readable で利用可能にします。

これは通常、 pipeThrough() メソッドを ReadableStream ソースに対して利用します。

textReadable
  .pipeThrough(new TextEncoderStream())
  .pipeTo(byteWritable);

new TextEncoderStream() コンストラクタの手順は以下の通りです:

  1. thisエンコーダーUTF-8エンコーダーのインスタンスに設定する。

  2. transformAlgorithmchunk引数を受け取り、チャンクのエンコードとエンキューアルゴリズムをthischunkで実行するアルゴリズムとする。

  3. flushAlgorithmを、エンコードとフラッシュアルゴリズムをthisで実行するアルゴリズムとする。

  4. transformStreamTransformStreamの新しいインスタンスとする。

  5. transformStreamtransformAlgorithmtransformAlgorithmflushAlgorithmflushAlgorithmにしてセットアップする。

  6. thistransformtransformStreamに設定する。


チャンクのエンコードとエンキューアルゴリズムは、TextEncoderStreamオブジェクトencoderchunkが与えられたとき、次の手順を実行します:

  1. inputchunkDOMString変換した結果とする。

  2. inputコード単位のI/Oキューに変換する。

    DOMStringやコード単位のI/Oキューを使うことで、チャンク間で分割されたサロゲートペアも適切なスカラー値に再構成できます。その他の動作はUSVStringと同じです。特に、孤立したサロゲートはU+FFFD(�)に置き換えられます。

  3. outputをバイトのI/Oキュー « キュー終端 » とする。

  4. trueの間、以下を繰り返す:

    1. item読み取りinputから取得する。

    2. もしitemキュー終端なら:

      1. outputをバイト列に変換する。

      2. もしoutput空でないなら:

        1. chunkUint8Arrayオブジェクトの作成outputencoder関連レルムを与える)で得る。

        2. エンキューchunkencodertransformに追加する。

      3. リターンする。

    3. resultコード単位からスカラー値への変換アルゴリズム(encoderiteminputを与える)で実行した結果とする。

    4. もしresultcontinueでなければ、要素を処理するresultencoderエンコーダーinputoutput、"fatal")を実行する。

コード単位からスカラー値への変換アルゴリズムは、TextEncoderStreamオブジェクトencoderコード単位item、コード単位のI/Oキューinputが与えられたとき、次の手順を実行します:

  1. もしencoderリーディングサロゲートがnullでなければ:

    1. leadingSurrogateencoderリーディングサロゲートとする。

    2. encoderリーディングサロゲートをnullに設定する。

    3. もしitemトレーリングサロゲートなら、サロゲートからスカラー値leadingSurrogateitem)を返す。

    4. iteminputに復元する。

    5. U+FFFD(�)を返す。

  2. もしitemリーディングサロゲートなら、encoderリーディングサロゲートitemに設定し、continueを返す。

  3. もしitemトレーリングサロゲートなら、U+FFFD(�)を返す。

  4. itemを返す。

これはInfra標準の「文字列をスカラー値文字列に変換する」アルゴリズムと等価ですが、文字列間でサロゲートペアが分割されても対応できるようになっています。[INFRA]

エンコードとフラッシュアルゴリズムは、TextEncoderStreamオブジェクトencoderが与えられたとき、次の手順を実行します:

  1. もしencoderリーディングサロゲートがnullでなければ:

    1. chunkUint8Arrayオブジェクトの作成(« 0xEF, 0xBF, 0xBD » と encoder関連レルムを与える)で得る。

      これはUTF-8バイトでのU+FFFD(�)です。

    2. エンキューchunkencodertransformに追加する。

8. エンコーディング

8.1. UTF-8

8.1.1. UTF-8デコーダー

バイト順マークはラベルよりも優先されます。これは実際のコンテンツでより正確であることが判明しているためです。したがって、これはUTF-8デコーダーアルゴリズムの一部ではなく、デコードUTF-8デコードアルゴリズムで扱われます。

UTF-8デコーダーには次が関連付けられています:

UTF-8コードポイント
UTF-8受信済みバイト数
UTF-8必要バイト数
いずれも数値。初期値は0。
UTF-8下限値
バイト。初期値は0x80。
UTF-8上限値
バイト。初期値は0xBF。

UTF-8デコーダーハンドラioQueueおよびbyteを受け取り、次の手順を実行します:

  1. もしbyteキュー終端であり、UTF-8必要バイト数が0でなければ、 UTF-8必要バイト数を0に設定し、errorを返す。

  2. もしbyteキュー終端なら、終端を返す。

  3. UTF-8必要バイト数が0なら、byteに基づき:

    0x00 〜 0x7F

    byte値のコードポイントを返す。

    0xC2 〜 0xDF
    1. UTF-8必要バイト数を1に設定する。

    2. UTF-8コードポイントbyte & 0x1Fを設定する。

      byteの下位5ビット。

    0xE0 〜 0xEF
    1. もしbyteが0xE0なら、UTF-8下限値を0xA0に設定する。

    2. もしbyteが0xEDなら、UTF-8上限値を0x9Fに設定する。

    3. UTF-8必要バイト数を2に設定する。

    4. UTF-8コードポイントbyte & 0xFを設定する。

      byteの下位4ビット。

    0xF0 〜 0xF4
    1. もしbyteが0xF0なら、UTF-8下限値を0x90に設定する。

    2. もしbyteが0xF4なら、UTF-8上限値を0x8Fに設定する。

    3. UTF-8必要バイト数を3に設定する。

    4. UTF-8コードポイントbyte & 0x7を設定する。

      byteの下位3ビット。

    それ以外

    errorを返す。

    continueを返す。

  4. もしbyteUTF-8下限値UTF-8上限値の範囲外なら:

    1. UTF-8コードポイントUTF-8必要バイト数UTF-8受信済みバイト数を0にし、UTF-8下限値を0x80、UTF-8上限値を0xBFに設定する。

    2. byteioQueueに復元する。

    3. errorを返す。

  5. UTF-8下限値を0x80、UTF-8上限値を0xBFに設定する。

  6. UTF-8コードポイントを(UTF-8コードポイント << 6) | (byte & 0x3F)に設定する。

    UTF-8コードポイントの既存ビット列を6ビット左シフトし、下位6ビットをbyteの下位6ビットで埋める。

  7. UTF-8受信済みバイト数を1増やす。

  8. UTF-8受信済みバイト数UTF-8必要バイト数と等しくなければ、continueを返す。

  9. codePointUTF-8コードポイントとする。

  10. UTF-8コードポイントUTF-8必要バイト数UTF-8受信済みバイト数を0にする。

  11. 値がcodePointのコードポイントを返す。

上記UTF-8デコーダーの制約は、Unicode標準の「U+FFFDのベストプラクティス」に一致します。エンコーディング標準では他の挙動は許可されません(同じ結果を得る他のアルゴリズムは可、むしろ推奨)。[UNICODE]

8.1.2. UTF-8エンコーダー

UTF-8エンコーダーハンドラunusedおよびcodePointを受け取り、次の手順を実行します:

  1. もしcodePointキュー終端なら、終端を返す。

  2. もしcodePointASCIIコードポイントなら、その値のバイトを返す。

  3. codePointの範囲に応じてcountoffsetを設定する:

    U+0080〜U+07FF(含む)
    1および0xC0
    U+0800〜U+FFFF(含む)
    2および0xE0
    U+10000〜U+10FFFF(含む)
    3および0xF0
  4. bytesを、最初のバイトが(codePoint >> (6 × count)) + offsetであるバイト列とする。

  5. countが0より大きい間:

    1. tempcodePoint >> (6 × (count − 1))とする。

    2. bytesに0x80 | (temp & 0x3F)を追加する。

    3. countを1減らす。

  6. バイト列bytesを順に返す。

このアルゴリズムはUnicode標準に記載のものと同じ結果になります。ここでは完全性のため記載しています。[UNICODE]

9. レガシー単一バイトエンコーディング

各バイトが単一の符号位置か何も表さないエンコーディングは、単一バイトエンコーディングです。 単一バイトエンコーディングは共通の デコーダーおよびエンコーダーを持ちます。単一バイト索引は、単一バイトデコーダーおよび 単一バイトエンコーダーで参照され、以下の表で定義されており、使用する単一バイトエンコーディングに依存します。ほとんどの単一バイトエンコーディングは、固有の索引を持ちます(2つを除く)。

IBM866 index-ibm866.txt IBM866索引可視化 IBM866索引BMPカバレッジ
ISO-8859-2 index-iso-8859-2.txt ISO-8859-2索引可視化 ISO-8859-2索引BMPカバレッジ
ISO-8859-3 index-iso-8859-3.txt ISO-8859-3索引可視化 ISO-8859-3索引BMPカバレッジ
ISO-8859-4 index-iso-8859-4.txt ISO-8859-4索引可視化 ISO-8859-4索引BMPカバレッジ
ISO-8859-5 index-iso-8859-5.txt ISO-8859-5索引可視化 ISO-8859-5索引BMPカバレッジ
ISO-8859-6 index-iso-8859-6.txt ISO-8859-6索引可視化 ISO-8859-6索引BMPカバレッジ
ISO-8859-7 index-iso-8859-7.txt ISO-8859-7索引可視化 ISO-8859-7索引BMPカバレッジ
ISO-8859-8 index-iso-8859-8.txt ISO-8859-8索引可視化 ISO-8859-8索引BMPカバレッジ
ISO-8859-8-I
ISO-8859-10 index-iso-8859-10.txt ISO-8859-10索引可視化 ISO-8859-10索引BMPカバレッジ
ISO-8859-13 index-iso-8859-13.txt ISO-8859-13索引可視化 ISO-8859-13索引BMPカバレッジ
ISO-8859-14 index-iso-8859-14.txt ISO-8859-14索引可視化 ISO-8859-14索引BMPカバレッジ
ISO-8859-15 index-iso-8859-15.txt ISO-8859-15索引可視化 ISO-8859-15索引BMPカバレッジ
ISO-8859-16 index-iso-8859-16.txt ISO-8859-16索引可視化 ISO-8859-16索引BMPカバレッジ
KOI8-R index-koi8-r.txt KOI8-R索引可視化 KOI8-R索引BMPカバレッジ
KOI8-U index-koi8-u.txt KOI8-U索引可視化 KOI8-U索引BMPカバレッジ
macintosh index-macintosh.txt macintosh索引可視化 macintosh索引BMPカバレッジ
windows-874 index-windows-874.txt windows-874索引可視化 windows-874索引BMPカバレッジ
windows-1250 index-windows-1250.txt windows-1250索引可視化 windows-1250索引BMPカバレッジ
windows-1251 index-windows-1251.txt windows-1251索引可視化 windows-1251索引BMPカバレッジ
windows-1252 index-windows-1252.txt windows-1252索引可視化 windows-1252索引BMPカバレッジ
windows-1253 index-windows-1253.txt windows-1253索引可視化 windows-1253索引BMPカバレッジ
windows-1254 index-windows-1254.txt windows-1254索引可視化 windows-1254索引BMPカバレッジ
windows-1255 index-windows-1255.txt windows-1255索引可視化 windows-1255索引BMPカバレッジ
windows-1256 index-windows-1256.txt windows-1256索引可視化 windows-1256索引BMPカバレッジ
windows-1257 index-windows-1257.txt windows-1257索引可視化 windows-1257索引BMPカバレッジ
windows-1258 index-windows-1258.txt windows-1258索引可視化 windows-1258索引BMPカバレッジ
x-mac-cyrillic index-x-mac-cyrillic.txt x-mac-cyrillic索引可視化 x-mac-cyrillic索引BMPカバレッジ

ISO-8859-8ISO-8859-8-I は 別々のエンコーディングです。なぜならISO-8859-8はレイアウト方向に影響するためです。また、かつてはISO-8859-6と"ISO-8859-6-I"についても同様でしたが、現在はそうではありません。

9.1. 単一バイトデコーダー

単一バイトエンコーディングデコーダーハンドラunusedbyteを受け取り、次の手順を実行します:

  1. もしbyteキュー終端なら、終端を返す。

  2. もしbyteASCIIバイトなら、その値のコードポイントを返す。

  3. codePointbyte−0x80を単一バイト索引での索引符号位置とする。

  4. もしcodePointがnullなら、errorを返す。

  5. codePoint値のコードポイントを返す。

9.2. 単一バイトエンコーダー

単一バイトエンコーディングエンコーダーハンドラunusedcodePointを受け取り、次の手順を実行します:

  1. もしcodePointキュー終端なら、終端を返す。

  2. もしcodePointASCIIコードポイントなら、その値のバイトを返す。

  3. pointercodePoint単一バイト索引における索引ポインタとする。

  4. もしpointerがnullなら、errorcodePoint付き)を返す。

  5. pointer+0x80の値のバイトを返す。

10. レガシー多バイト中国語(簡体字)エンコーディング

10.1. GBK

10.1.1. GBKデコーダー

GBKデコーダーgb18030デコーダーです。

10.1.2. GBKエンコーダー

GBKエンコーダーgb18030エンコーダーで、is GBKをtrueに設定したものです。

GBKgb18030と完全に同一視しないのは、レガシーサーバーやGBKエンコーダーで生成されたコンテンツの他の利用者を壊すリスクを減らすための慎重な対応です。

10.2. gb18030

10.2.1. gb18030デコーダー

gb18030デコーダーには次が関連付けられています:

gb18030 first
gb18030 second
gb18030 third
いずれもバイト。初期値は0x00。

gb18030デコーダーハンドラioQueuebyteを受け取り、次の手順を実行します:

  1. もしbyteキュー終端であり、gb18030 firstgb18030 secondgb18030 thirdがすべて0x00なら、終端を返す。

  2. もしbyteキュー終端であり、gb18030 firstgb18030 second、またはgb18030 thirdが0x00でないなら、それらを0x00に設定し、errorを返す。

  3. もしgb18030 thirdが0x00でなければ:

    1. もしbyteが0x30〜0x39の範囲外なら:

      1. « gb18030 second, gb18030 third, byte » をioQueueに復元する。

      2. gb18030 firstgb18030 secondgb18030 thirdを0x00に設定する。

      3. errorを返す。

    2. codePointを次の式でindex gb18030 ranges code pointとする:((gb18030 first − 0x81) × (10 × 126 × 10)) + ((gb18030 second − 0x30) × (10 × 126)) + ((gb18030 third − 0x81) × 10) + byte − 0x30。

    3. gb18030 firstgb18030 secondgb18030 thirdを0x00に設定する。

    4. もしcodePointがnullなら、errorを返す。

    5. 値がcodePointのコードポイントを返す。

  4. もしgb18030 secondが0x00でなければ:

    1. もしbyteが0x81〜0xFEの範囲なら、gb18030 thirdbyteを設定し、continueを返す。

    2. « gb18030 second, byte » をioQueueに復元し、gb18030 firstおよびgb18030 secondを0x00に設定し、errorを返す。

  5. もしgb18030 firstが0x00でなければ:

    1. もしbyteが0x30〜0x39の範囲なら、gb18030 secondbyteを設定し、continueを返す。

    2. leadinggb18030 firstとする。

    3. gb18030 firstを0x00に設定する。

    4. pointerをnullに設定する。

    5. offsetbyteが0x7F未満なら0x40、そうでなければ0x41とする。

    6. もしbyteが0x40〜0x7E、または0x80〜0xFEの範囲なら、pointerを(leading − 0x81) × 190 + (byteoffset)に設定する。

    7. codePointpointerがnullならnull、そうでなければindex code pointpointerindex gb18030)とする。

    8. もしcodePointがnullでなければ、その値のコードポイントを返す。

    9. もしbyteASCIIバイトなら、byteioQueueに復元する。

    10. errorを返す。

  6. もしbyteASCIIバイトなら、その値のコードポイントを返す。

  7. もしbyteが0x80なら、コードポイントU+20AC (€)を返す。

  8. もしbyteが0x81〜0xFEの範囲なら、gb18030 firstbyteを設定し、continueを返す。

  9. errorを返す。

10.2.2. gb18030エンコーダー

gb18030エンコーダーには、is GBK(真偽値、初期値はfalse)が関連付けられています。

gb18030エンコーダーハンドラunusedcodePointを受け取り、次の手順を実行します:

  1. もしcodePointキュー終端なら、終端を返す。

  2. もしcodePointASCIIコードポイントなら、その値のバイトを返す。

  3. もしcodePointがU+E5E5なら、errorcodePoint付き)を返す。

    index gb18030は0xA3 0xA0をU+E5E5ではなくU+3000(全角空白)にマッピングします。これは現行コンテンツとの互換性のためであり、往復変換はできません。

  4. もしis GBKがtrueかつcodePointがU+20AC(€)なら、バイト0x80を返す。

  5. もし下表の1列目がcodePointである行があれば、2列目の2バイトを返す:

    コードポイント バイト
    U+E78D 0xA6 0xD9
    U+E78E 0xA6 0xDA
    U+E78F 0xA6 0xDB
    U+E790 0xA6 0xDC
    U+E791 0xA6 0xDD
    U+E792 0xA6 0xDE
    U+E793 0xA6 0xDF
    U+E794 0xA6 0xEC
    U+E795 0xA6 0xED
    U+E796 0xA6 0xF3
    U+E81E 0xFE 0x59
    U+E826 0xFE 0x61
    U+E82B 0xFE 0x66
    U+E82C 0xFE 0x67
    U+E832 0xFE 0x6D
    U+E843 0xFE 0x7E
    U+E854 0xFE 0x90
    U+E864 0xFE 0xA0

    この非対称なエンコーダーテーブルはGB18030-2005標準との互換性維持のためです。詳細はindex gb18030 rangesの説明も参照。

  6. pointerindex pointercodePointindex gb18030)とする。

  7. もしpointerがnullでなければ:

    1. leadingpointer/190+0x81とする。

    2. trailingpointer%190とする。

    3. offsettrailing<0x3Fなら0x40、そうでなければ0x41とする。

    4. 2バイト:leadingtrailing+offsetを返す。

  8. もしis GBKがtrueなら、errorcodePoint付き)を返す。

  9. pointerindex gb18030 ranges pointercodePoint)に設定する。

  10. byte1pointer/(10×126×10)とする。

  11. pointerpointer%(10×126×10)に設定する。

  12. byte2pointer/(10×126)とする。

  13. pointerpointer%(10×126)に設定する。

  14. byte3pointer/10とする。

  15. byte4pointer%10とする。

  16. 4バイト:byte1+0x81、byte2+0x30、byte3+0x81、byte4+0x30を返す。

11. レガシー多バイト中国語(繁体字)エンコーディング

11.1. Big5

11.1.1. Big5デコーダー

Big5デコーダーにはBig5リードバイトが関連付けられており、バイトで初期値は0x00です。

Big5デコーダーハンドラioQueuebyteを受け取り、次の手順を実行します:

  1. もしbyteキュー終端かつBig5リードバイトが0x00でなければ、Big5リードバイトを0x00にしてerrorを返す。

  2. もしbyteキュー終端かつBig5リードバイトが0x00なら、終端を返す。

  3. もしBig5リードバイトが0x00でなければ:

    1. leadingBig5リードバイトとする。

    2. Big5リードバイトを0x00にする。

    3. pointerをnullとする。

    4. offsetbyteが0x7F未満なら0x40、そうでなければ0x62とする。

    5. もしbyteが0x40〜0x7Eまたは0xA1〜0xFEの範囲なら、pointerを(leading−0x81)×157 + (byteoffset)とする。

    6. 下表の1列目がpointerである行があれば、その2列目の2つのコードポイントを返す(3列目は無視):

      ポインタ コードポイント 備考
      1133 U+00CA U+0304 Ê̄ (LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND MACRON)
      1135 U+00CA U+030C Ê̌ (LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND CARON)
      1164 U+00EA U+0304 ê̄ (LATIN SMALL LETTER E WITH CIRCUMFLEX AND MACRON)
      1166 U+00EA U+030C ê̌ (LATIN SMALL LETTER E WITH CIRCUMFLEX AND CARON)

      索引(indexes)は単一コードポイントに限定されるため、これらのポインタはこの表で扱われます。

    7. codePointpointerがnullならnull、それ以外はindex code pointpointerindex Big5)とする。

    8. codePointがnullでなければ、その値のコードポイントを返す。

    9. もしbyteASCIIバイトなら、byteioQueueに復元する。

    10. errorを返す。

  4. もしbyteASCIIバイトなら、その値のコードポイントを返す。

  5. もしbyteが0x81〜0xFEの範囲なら、Big5リードバイトbyteを設定し、continueを返す。

  6. errorを返す。

11.1.2. Big5エンコーダー

Big5エンコーダーハンドラunusedcodePointを受け取り、次の手順を実行します:

  1. もしcodePointキュー終端なら、終端を返す。

  2. もしcodePointASCIIコードポイントなら、その値のバイトを返す。

  3. pointercodePointindex Big5 pointerとする。

  4. もしpointerがnullなら、errorcodePoint付き)を返す。

  5. leadingpointer/157+0x81とする。

  6. trailingpointer%157とする。

  7. offsettrailing<0x3Fなら0x40、そうでなければ0x62とする。

  8. 2バイト:leadingtrailing+offsetを返す。

12. レガシー多バイト日本語エンコーディング

12.1. EUC-JP

12.1.1. EUC-JPデコーダー

EUC-JPデコーダーには次が関連付けられています:

EUC-JP jis0212
真偽値(初期値false)。
EUC-JPリードバイト
バイト(初期値0x00)。

EUC-JPデコーダーハンドラioQueuebyteを受け取り、次の手順を実行します:

  1. もしbyteキュー終端かつEUC-JPリードバイトが0x00でなければ、EUC-JPリードバイトを0x00にしてerrorを返す。

  2. もしbyteキュー終端かつEUC-JPリードバイトが0x00なら、終端を返す。

  3. もしEUC-JPリードバイトが0x8Eかつbyteが0xA1〜0xDFの範囲なら、EUC-JPリードバイトを0x00にして、値0xFF61−0xA1+byteのコードポイントを返す。

  4. もしEUC-JPリードバイトが0x8Fかつbyteが0xA1〜0xFEの範囲なら、EUC-JP jis0212をtrueに、EUC-JPリードバイトbyteにし、continueを返す。

  5. もしEUC-JPリードバイトが0x00でなければ:

    1. leadingEUC-JPリードバイトとする。

    2. EUC-JPリードバイトを0x00にする。

    3. codePointをnullとする。

    4. もしleadingおよびbyteがともに0xA1〜0xFEの範囲なら、codePointを、EUC-JP jis0212がfalseなら(leading−0xA1)×94+byte−0xA1をindex jis0208で、trueなら同じ計算式でindex jis0212での値とする。

    5. EUC-JP jis0212をfalseにする。

    6. もしcodePointがnullでなければ、その値のコードポイントを返す。

    7. もしbyteASCIIバイトなら、byteioQueueに復元する。

    8. errorを返す。

  6. もしbyteASCIIバイトなら、その値のコードポイントを返す。

  7. もしbyteが0x8E、0x8F、または0xA1〜0xFEの範囲なら、EUC-JPリードバイトbyteを設定し、continueを返す。

  8. errorを返す。

12.1.2. EUC-JPエンコーダー

EUC-JPエンコーダーハンドラunusedcodePointを受け取り、次の手順を実行します:

  1. もしcodePointキュー終端なら、終端を返す。

  2. もしcodePointASCIIコードポイントなら、その値のバイトを返す。

  3. もしcodePointがU+00A5(¥)なら、バイト0x5Cを返す。

  4. もしcodePointがU+203E(‾)なら、バイト0x7Eを返す。

  5. もしcodePointがU+FF61(。)〜U+FF9F(゚)の範囲なら、2バイト0x8EとcodePoint−0xFF61+0xA1を返す。

  6. もしcodePointがU+2212(−)なら、U+FF0D(-)に設定する。

  7. pointercodePointindex pointerindex jis0208)とする。

    pointerがnullでなければ、index jis0208の性質とindex pointer操作により8836未満となる。

  8. もしpointerがnullなら、errorcodePoint付き)を返す。

  9. leadingpointer/94+0xA1とする。

  10. trailingpointer%94+0xA1とする。

  11. 2バイト:leadingtrailingを返す。

12.2. ISO-2022-JP

12.2.1. ISO-2022-JPデコーダー

ISO-2022-JPデコーダーには次が関連付けられています:

ISO-2022-JPデコーダー状態
状態(初期値はASCII)。
ISO-2022-JPデコーダー出力状態
状態(初期値もASCII)。
ISO-2022-JPリードバイト
バイト(初期値0x00)。
ISO-2022-JP出力
真偽値(初期値false)。

ISO-2022-JPデコーダーハンドラioQueuebyteを受け取り、ISO-2022-JPデコーダー状態によって分岐しながら次の手順を実行します:

ASCII

byteに基づく:

0x1B

ISO-2022-JPデコーダー状態エスケープ開始に設定し、continueを返す。

0x00〜0x7F(ただし0x0E, 0x0F, 0x1Bを除く)

ISO-2022-JP出力をfalseにし、値がbyteのコードポイントを返す。

キュー終端

終端を返す。

それ以外

ISO-2022-JP出力をfalseにし、errorを返す。

Roman

byteに基づく:

0x1B

ISO-2022-JPデコーダー状態エスケープ開始に設定し、continueを返す。

0x5C

ISO-2022-JP出力をfalseにし、コードポイントU+00A5(¥)を返す。

0x7E

ISO-2022-JP出力をfalseにし、コードポイントU+203E(‾)を返す。

0x00〜0x7F(ただし0x0E, 0x0F, 0x1B, 0x5C, 0x7Eを除く)

ISO-2022-JP出力をfalseにし、値がbyteのコードポイントを返す。

キュー終端

終端を返す。

それ以外

ISO-2022-JP出力をfalseにし、errorを返す。

カタカナ

byteに基づく:

0x1B

ISO-2022-JPデコーダー状態エスケープ開始に設定し、continueを返す。

0x21〜0x5F

ISO-2022-JP出力をfalseにし、値0xFF61−0x21+byteのコードポイントを返す。

キュー終端

終端を返す。

それ以外

ISO-2022-JP出力をfalseにし、errorを返す。

リードバイト

byteに基づく:

0x1B

ISO-2022-JPデコーダー状態エスケープ開始に設定し、continueを返す。

0x21〜0x7E

ISO-2022-JP出力をfalseにし、ISO-2022-JPリードバイトbyteに、 ISO-2022-JPデコーダー状態トレイルバイトに設定し、continueを返す。

キュー終端

終端を返す。

それ以外

ISO-2022-JP出力をfalseにし、errorを返す。

トレイルバイト

byteに基づく:

0x1B

ISO-2022-JPデコーダー状態エスケープ開始に設定し、errorを返す。

0x21〜0x7E
  1. ISO-2022-JPデコーダー状態リードバイトに設定する。

  2. pointerを(ISO-2022-JPリードバイト−0x21)×94+byte−0x21とする。

  3. codePointindex code pointpointerindex jis0208)とする。

  4. もしcodePointがnullなら、errorを返す。

  5. 値がcodePointのコードポイントを返す。

キュー終端

ISO-2022-JPデコーダー状態リードバイトに設定し、errorを返す。

それ以外

ISO-2022-JPデコーダー状態リードバイトに設定し、errorを返す。

エスケープ開始
  1. もしbyteが0x24または0x28なら、ISO-2022-JPリードバイトbyteに、ISO-2022-JPデコーダー状態エスケープにし、continueを返す。

  2. もしbyteキュー終端でなければ、byteioQueueに復元する。

  3. ISO-2022-JP出力をfalse、ISO-2022-JPデコーダー状態ISO-2022-JPデコーダー出力状態にし、errorを返す。

エスケープ
  1. leadingISO-2022-JPリードバイトとし、ISO-2022-JPリードバイトを0x00にする。

  2. stateをnullとする。

  3. もしleadingが0x28かつbyteが0x42なら、stateASCIIにする。

  4. もしleadingが0x28かつbyteが0x4Aなら、stateRomanにする。

  5. もしleadingが0x28かつbyteが0x49なら、stateカタカナにする。

  6. もしleadingが0x24かつbyteが0x40または0x42なら、stateリードバイトにする。

  7. もしstateがnullでなければ:

    1. ISO-2022-JPデコーダー状態ISO-2022-JPデコーダー出力状態stateに設定する。

    2. outputISO-2022-JP出力の値とする。

    3. ISO-2022-JP出力をtrueにする。

    4. outputがfalseならcontinueを、そうでなければerrorを返す。

  8. もしbyteキュー終端なら、leadingioQueueに復元する。そうでなければ、« leading, byte »ioQueueに復元する。

  9. ISO-2022-JP出力をfalse、ISO-2022-JPデコーダー状態ISO-2022-JPデコーダー出力状態にし、errorを返す。

12.2.2. ISO-2022-JPエンコーダー

ISO-2022-JPエンコーダーは、複数回の出力を連結したものを対応するデコーダーで実行した場合にerrorになることがある唯一のエンコーダーです。

U+00A5(¥)をエンコードすると0x1B 0x28 0x4A 0x5C 0x1B 0x28 0x42となります。これを2回繰り返して連結し、デコードするとU+00A5 U+FFFD U+00A5になります。

ISO-2022-JPエンコーダーには ISO-2022-JPエンコーダー状態があり、 ASCIIRomanjis0208のいずれかで、初期値は ASCIIです。

ISO-2022-JPエンコーダーハンドラioQueuecodePointを受け取り、次の手順を実行します:

  1. もしcodePointキュー終端で、ISO-2022-JPエンコーダー状態ASCIIでなければ、ISO-2022-JPエンコーダー状態ASCIIにし、3バイト0x1B 0x28 0x42を返す。

  2. もしcodePointキュー終端かつISO-2022-JPエンコーダー状態ASCIIなら、終端を返す。

  3. もしISO-2022-JPエンコーダー状態ASCIIまたは RomanかつcodePointがU+000E,U+000F,U+001Bなら、U+FFFD(�)でerrorを返す。

    攻撃防止のため、codePoint自身ではなくU+FFFD(�)を返します。

  4. もしISO-2022-JPエンコーダー状態ASCIIかつcodePointASCIIコードポイントなら、その値のバイトを返す。

  5. もしISO-2022-JPエンコーダー状態RomanかつcodePointASCIIコードポイント(U+005C(\)とU+007E(~)を除く)またはU+00A5(¥)またはU+203E(‾)なら:

    1. もしcodePointASCIIコードポイントなら、その値のバイトを返す。

    2. もしcodePointがU+00A5(¥)なら、バイト0x5Cを返す。

    3. もしcodePointがU+203E(‾)なら、バイト0x7Eを返す。

  6. もしcodePointASCIIコードポイントで、ISO-2022-JPエンコーダー状態ASCIIでないなら、codePointioQueueに復元し、ISO-2022-JPエンコーダー状態ASCIIにし、3バイト0x1B 0x28 0x42を返す。

  7. もしcodePointがU+00A5(¥)またはU+203E(‾)で、ISO-2022-JPエンコーダー状態Romanでないなら、codePointioQueueに復元し、ISO-2022-JPエンコーダー状態Romanにし、3バイト0x1B 0x28 0x4Aを返す。

  8. もしcodePointがU+2212(−)なら、U+FF0D(-)に設定する。

  9. もしcodePointがU+FF61(。)〜U+FF9F(゚)の範囲なら、codePoint−0xFF61をindex ISO-2022-JP katakanaindex code pointとする。

  10. pointercodePointindex pointerindex jis0208)とする。

    pointerがnullでなければ、index jis0208index pointer操作の性質から8836未満となる。

  11. もしpointerがnullなら:

    1. もしISO-2022-JPエンコーダー状態jis0208なら、codePointioQueueに復元し、ISO-2022-JPエンコーダー状態ASCIIにし、3バイト0x1B 0x28 0x42を返す。

    2. errorcodePoint付き)を返す。

  12. もしISO-2022-JPエンコーダー状態jis0208でないなら、codePointioQueueに復元し、ISO-2022-JPエンコーダー状態jis0208にし、3バイト0x1B 0x24 0x42を返す。

  13. leadingpointer/94+0x21とする。

  14. trailingpointer%94+0x21とする。

  15. 2バイト:leadingtrailingを返す。

12.3. Shift_JIS

12.3.1. Shift_JISデコーダー

Shift_JISデコーダーには Shift_JISリードバイト (バイト、初期値0x00)が関連付けられています。

Shift_JISデコーダーハンドラioQueuebyteを受け取り、次の手順を実行します:

  1. もしbyteキュー終端かつShift_JISリードバイトが0x00でなければ、Shift_JISリードバイトを0x00にしてerrorを返す。

  2. もしbyteキュー終端かつShift_JISリードバイトが0x00なら、終端を返す。

  3. もしShift_JISリードバイトが0x00でなければ:

    1. leadingShift_JISリードバイトとする。

    2. Shift_JISリードバイトを0x00にする。

    3. pointerをnullとする。

    4. offsetbyteが0x7F未満なら0x40、そうでなければ0x41とする。

    5. leadingOffsetleadingが0xA0未満なら0x81、そうでなければ0xC1とする。

    6. もしbyteが0x40〜0x7Eまたは0x80〜0xFCの範囲なら、pointerを(leadingleadingOffset)×188+byteoffsetとする。

    7. もしpointerが8836〜10715の範囲なら、値0xE000−8836+pointerのコードポイントを返す。

      これはWindows由来のEUDCの互換的レガシーです。

    8. codePointpointerがnullならnull、そうでなければindex code pointpointerindex jis0208)とする。

    9. もしcodePointがnullでなければ、その値のコードポイントを返す。

    10. もしbyteASCIIバイトなら、byteioQueueに復元する。

    11. errorを返す。

  4. もしbyteASCIIバイトまたは0x80なら、その値のコードポイントを返す。

  5. もしbyteが0xA1〜0xDFの範囲なら、値0xFF61−0xA1+byteのコードポイントを返す。

  6. もしbyteが0x81〜0x9Fまたは0xE0〜0xFCの範囲なら、Shift_JISリードバイトbyteを設定し、continueを返す。

  7. errorを返す。

12.3.2. Shift_JISエンコーダー

Shift_JISエンコーダーハンドラunusedcodePointを受け取り、次の手順を実行します:

  1. もしcodePointキュー終端なら、終端を返す。

  2. もしcodePointASCIIコードポイントまたはU+0080なら、その値のバイトを返す。

  3. もしcodePointがU+00A5(¥)なら、バイト0x5Cを返す。

  4. もしcodePointがU+203E(‾)なら、バイト0x7Eを返す。

  5. もしcodePointがU+FF61(。)〜U+FF9F(゚)の範囲なら、値codePoint−0xFF61+0xA1のバイトを返す。

  6. もしcodePointがU+2212(−)なら、U+FF0D(-)に設定する。

  7. pointercodePointindex Shift_JIS pointerとする。

  8. もしpointerがnullなら、errorcodePoint付き)を返す。

  9. leadingpointer/188とする。

  10. leadingOffsetleadingが0x1F未満なら0x81、そうでなければ0xC1とする。

  11. trailingpointer%188とする。

  12. offsettrailingが0x3F未満なら0x40、そうでなければ0x41とする。

  13. 2バイト:leading+leadingOffsettrailing+offsetを返す。

13. レガシー多バイト韓国語エンコーディング

13.1. EUC-KR

13.1.1. EUC-KRデコーダー

EUC-KRデコーダーにはEUC-KRリードバイト (バイト、初期値0x00)が関連付けられています。

EUC-KRデコーダーハンドラioQueuebyteを受け取り、次の手順を実行します:

  1. もしbyteキュー終端かつEUC-KRリードバイトが0x00でなければ、EUC-KRリードバイトを0x00にしてerrorを返す。

  2. もしbyteキュー終端かつEUC-KRリードバイトが0x00なら、終端を返す。

  3. もしEUC-KRリードバイトが0x00でなければ:

    1. leadingEUC-KRリードバイトとする。

    2. EUC-KRリードバイトを0x00にする。

    3. pointerをnullとする。

    4. もしbyteが0x41〜0xFEの範囲なら、pointerを(leading−0x81)×190+(byte−0x41)とする。

    5. codePointpointerがnullならnull、そうでなければindex code pointpointerindex EUC-KR)とする。

    6. もしcodePointがnullでなければ、その値のコードポイントを返す。

    7. もしbyteASCIIバイトなら、byteioQueueに復元する。

    8. errorを返す。

  4. もしbyteASCIIバイトなら、その値のコードポイントを返す。

  5. もしbyteが0x81〜0xFEの範囲なら、EUC-KRリードバイトbyteを設定し、continueを返す。

  6. errorを返す。

13.1.2. EUC-KRエンコーダー

EUC-KRエンコーダーハンドラunusedcodePointを受け取り、次の手順を実行します:

  1. もしcodePointキュー終端なら、終端を返す。

  2. もしcodePointASCIIコードポイントなら、その値のバイトを返す。

  3. pointercodePointindex pointerindex EUC-KR)とする。

  4. もしpointerがnullなら、errorcodePoint付き)を返す。

  5. leadingpointer/190+0x81とする。

  6. trailingpointer%190+0x41とする。

  7. 2バイト:leadingtrailingを返す。

14. レガシーその他エンコーディング

14.1. replacement

replacement エンコーディングは、サーバーとクライアントでサポートされるエンコーディングの不一致を悪用する攻撃を防ぐために存在します。

14.1.1. replacementデコーダー

replacementデコーダーにはreplacement error returned(真偽値、初期値false)が関連付けられています。

replacementデコーダーハンドラunusedbyteを受け取り、次の手順を実行します:

  1. もしbyteキュー終端なら、終端を返す。

  2. もしreplacement error returnedがfalseなら、それをtrueに設定し、errorを返す。

  3. 終端を返す。

14.2. UTF-16BE/LE共通インフラストラクチャ

UTF-16BE/LEUTF-16BEまたはUTF-16LEです。

14.2.1. 共通UTF-16デコーダー

バイトオーダーマークはラベルよりも優先されます。これは実際のコンテンツでより正確であることが確認されているためです。したがってこれは共通UTF-16デコーダーアルゴリズムの一部ではなく、decodeアルゴリズムの一部です。

共通UTF-16デコーダーには次が関連付けられています:

UTF-16リードバイト
nullまたはバイト(初期値null)。
UTF-16リードサロゲート
nullまたはリードサロゲート(初期値null)。
is UTF-16BEデコーダー
真偽値(初期値false)。

共通UTF-16デコーダーハンドラioQueuebyteを受け取り、次の手順を実行します:

  1. もしbyteキュー終端かつUTF-16リードバイトまたはUTF-16リードサロゲートがnullでなければ、両方をnullにし、errorを返す。

  2. もしbyteキュー終端かつUTF-16リードバイトUTF-16リードサロゲートがnullなら、終端を返す。

  3. もしUTF-16リードバイトがnullなら、UTF-16リードバイトbyteを設定し、continueを返す。

  4. codeUnitを次の結果とする:

    is UTF-16BEデコーダーがtrue

    (UTF-16リードバイト << 8) + byte

    is UTF-16BEデコーダーがfalse

    (byte << 8) + UTF-16リードバイト

  5. UTF-16リードバイトをnullにする。

  6. もしUTF-16リードサロゲートがnullでなければ:

    1. leadingSurrogateUTF-16リードサロゲートとする。

    2. UTF-16リードサロゲートをnullにする。

    3. もしcodeUnitトレイルサロゲートなら、surrogatesからスカラ値leadingSurrogatecodeUnitで返す。

    4. byte1codeUnit>>8とする。

    5. byte2codeUnit&0x00FFとする。

    6. bytesを、is UTF-16BEデコーダーがtrueならbyte1byte2、そうでなければbyte2byte1の2バイトのリストとする。

    7. bytesioQueueに復元し、errorを返す。

  7. もしcodeUnitリードサロゲートなら、UTF-16リードサロゲートcodeUnitを設定し、continueを返す。

  8. もしcodeUnitトレイルサロゲートなら、errorを返す。

  9. コードポイントcodeUnitを返す。

14.3. UTF-16BE

14.3.1. UTF-16BEデコーダー

UTF-16BEデコーダー共通UTF-16デコーダーであり、is UTF-16BEデコーダーをtrueに設定します。

14.4. UTF-16LE

"utf-16"は、現行コンテンツに対応するためUTF-16LEラベルです。

14.4.1. UTF-16LEデコーダー

UTF-16LEデコーダー共通UTF-16デコーダーです。

14.5. x-user-defined

これは技術的には単一バイトエンコーディングですが、アルゴリズム的に実装できるため個別に定義されています。

14.5.1. x-user-definedデコーダー

x-user-definedデコーダーハンドラunusedbyteを受け取り、次の手順を実行します:

  1. もしbyteキュー終端なら、終端を返す。

  2. もしbyteASCIIバイトなら、その値のコードポイントを返す。

  3. 値0xF780+byte−0x80のコードポイントを返す。

14.5.2. x-user-definedエンコーダー

x-user-definedエンコーダーハンドラunusedcodePointを受け取り、次の手順を実行します:

  1. もしcodePointキュー終端なら、終端を返す。

  2. もしcodePointASCIIコードポイントなら、その値のバイトを返す。

  3. もしcodePointがU+F780〜U+F7FFの範囲なら、値codePoint−0xF780+0x80のバイトを返す。

  4. errorcodePoint付き)を返す。

15. ブラウザーUI

ブラウザーは、リソースのエンコーディングを上書きする機能を有効にしないことが推奨されます。もしこの機能が存在する場合でも、前述のセキュリティ上の問題から、UTF-16BE/LEを選択肢として提供すべきではありません。また、リソースがUTF-16BE/LEでデコードされた場合はこの機能自体を無効にするべきです。

実装上の考慮事項

この標準のエンコーディングデコーダーは、I/Oキュー復元を任意にサポートする代わりに、以下のように実装できます:

  1. 現在のバイトを未読に戻す機能。

  2. gb18030ASCIIバイト)およびISO-2022-JP(0x24または0x28)のための1バイトバッファ。

    gb18030gb18030 thirdが0x00でない状態で不正なバイトに遭遇した場合、gb18030 secondを1バイトバッファに移し次に返されるようにし、gb18030 thirdを新たなgb18030 firstとし、1バイトバッファが返されて空になった後で0x00でないことを確認します。gb18030のfirstおよびthirdバイトの範囲が同じであるため、これは可能です。

ISO-2022-JPエンコーダーは追加状態としてISO-2022-JPエンコーダー状態が必要ですが、それ以外のこの標準のエンコーダーは追加の状態やバッファを必要としません。

謝辞

長年にわたりエンコーディングの相互運用性向上に貢献し、本標準の目標の推進に寄与してくださった多くの方々に感謝します。同様に、この標準を現行の形にするために多くの方々がご協力くださいました。

以下の方々に深く感謝します(敬称略): Adam Rice, Alan Chaney, Alexander Shtuchkin, Allen Wirfs-Brock, Andreu Botella, Aneesh Agrawal, Arkadiusz Michalski, Asmus Freytag, Ben Noordhuis, Bnaya Peretz, Boris Zbarsky, Bruno Haible, Cameron McCormack, Charles McCathieNeville, Christopher Foo, CodifierNL, David Carlisle, Domenic Denicola, Dominique Hazaël-Massieux, Doug Ewell, Erik van der Poel, 譚永鋒(Frank Yung-Fong Tang), Glenn Maynard, Gordon P. Hemsley, Henri Sivonen, Ian Hickson, J. King, James Graham, Jeffrey Yasskin, John Tamplin, Joshua Bell, 村井純(Jun Murai), 신정식(Jungshik Shin), Jxck, 강 성훈(Kang Seonghoon), 川幡太一(Kawabata Taichi), Ken Lunde, Ken Whistler, Kenneth Russell, 田村健人(Kent Tamura), Leif Halvard Silli, Luke Wagner, Maciej Hirsz, Makoto Kato, Mark Callow, Mark Crispin, Mark Davis, Martin Dürst, Masatoshi Kimura, Mattias Buelens, Ms2ger, Nigel Megitt, Nigel Tao, Norbert Lindenberg, Øistein E. Andersen, Peter Krefting, Philip Jägenstedt, Philip Taylor, Richard Ishida, Robbert Broersma, Robert Mustacchi, Ryan Dahl, Sam Sneddon, Shawn Steele, Simon Montagu, Simon Pieters, Simon Sapin, Stephen Checkoway, 寺田健(Takeshi Terada), Vyacheslav Matva, Wolf Lammen, 成瀬ゆい(Yui Naruse) ほか、皆さんのご支援に感謝します。

本標準はAnne van KesterenApple, annevk@annevk.nl)が執筆しました。API章は当初、Joshua Bell(Google)によって執筆されました。

知的財産権

Copyright © WHATWG(Apple, Google, Mozilla, Microsoft)。本作業はCreative Commons Attribution 4.0 International Licenseの下でライセンスされています。一部がソースコードに組み込まれる場合、該当部分はBSD 3-Clause Licenseの下でライセンスされます。

これは現行標準です。特許審査版に関心がある方は、現行標準レビュー草稿をご覧ください。

索引

この仕様で定義される用語

参照で定義されている用語

参考文献

規範的参考文献

[ECMASCRIPT]
ECMAScript Language Specification. URL: https://tc39.es/ecma262/multipage/
[HTML]
Anne van Kesteren; 他. HTML標準.現行標準.URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. 現行標準.URL: https://infra.spec.whatwg.org/
[STREAMS]
Adam Rice; 他. Streams Standard. 現行標準.URL: https://streams.spec.whatwg.org/
[UNICODE]
The Unicode Standard. URL: https://www.unicode.org/versions/latest/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL標準. 現行標準.URL: https://webidl.spec.whatwg.org/

参考情報

[ISO646]
Information technology — ISO 7-bit coded character set for information interchange. 1991年12月. 公開済. URL: https://www.iso.org/standard/4777.html
[ISO8859-1]
Information technology — 8-bit single-byte coded graphic character sets — Part 1: Latin alphabet No. 1. 1998年4月. 公開済. URL: https://www.iso.org/standard/28245.html
[URL]
Anne van Kesteren. URL Standard. 現行標準. URL: https://url.spec.whatwg.org/
[XML]
Tim Bray; 他. Extensible Markup Language (XML) 1.0 (第五版). 2008年11月26日. REC. URL: https://www.w3.org/TR/xml/

IDL索引

interface mixin TextDecoderCommon {
  readonly attribute DOMString encoding;
  readonly attribute boolean fatal;
  readonly attribute boolean ignoreBOM;
};

dictionary TextDecoderOptions {
  boolean fatal = false;
  boolean ignoreBOM = false;
};

dictionary TextDecodeOptions {
  boolean stream = false;
};

[Exposed=*]
interface TextDecoder {
  constructor(optional DOMString label = "utf-8", optional TextDecoderOptions options = {});

  USVString decode(optional AllowSharedBufferSource input, optional TextDecodeOptions options = {});
};
TextDecoder includes TextDecoderCommon;

interface mixin TextEncoderCommon {
  readonly attribute DOMString encoding;
};

dictionary TextEncoderEncodeIntoResult {
  unsigned long long read;
  unsigned long long written;
};

[Exposed=*]
interface TextEncoder {
  constructor();

  [NewObject] Uint8Array encode(optional USVString input = "");
  TextEncoderEncodeIntoResult encodeInto(USVString source, [AllowShared] Uint8Array destination);
};
TextEncoder includes TextEncoderCommon;

[Exposed=*]
interface TextDecoderStream {
  constructor(optional DOMString label = "utf-8", optional TextDecoderOptions options = {});
};
TextDecoderStream includes TextDecoderCommon;
TextDecoderStream includes GenericTransformStream;

[Exposed=*]
interface TextEncoderStream {
  constructor();
};
TextEncoderStream includes TextEncoderCommon;
TextEncoderStream includes GenericTransformStream;

MDN

TextDecoder/TextDecoder

In all current engines.

Firefox19+Safari10.1+Chrome38+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js11.0.0+
MDN

TextDecoder/decode

In all current engines.

Firefox19+Safari10.1+Chrome38+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js11.0.0+
MDN

TextDecoder/encoding

In all current engines.

Firefox19+Safari10.1+Chrome38+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js8.3.0+
MDN

TextDecoder/fatal

In all current engines.

Firefox36+Safari10.1+Chrome38+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js8.3.0+
MDN

TextDecoder/ignoreBOM

In all current engines.

Firefox63+Safari10.1+Chrome38+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js8.3.0+
MDN

TextDecoder

In all current engines.

Firefox19+Safari10.1+Chrome38+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js11.0.0+
MDN

TextDecoderStream/TextDecoderStream

In all current engines.

Firefox105+Safari14.1+Chrome71+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js16.6.0+
MDN

TextDecoderStream/encoding

In all current engines.

Firefox105+Safari14.1+Chrome71+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js16.6.0+
MDN

TextDecoderStream/fatal

In all current engines.

Firefox105+Safari14.1+Chrome71+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js16.6.0+
MDN

TextDecoderStream/ignoreBOM

In all current engines.

Firefox105+Safari14.1+Chrome71+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js16.6.0+
MDN

TextDecoderStream

In all current engines.

Firefox105+Safari14.1+Chrome71+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js18.0.0+
MDN

TextEncoder/TextEncoder

In all current engines.

Firefox18+Safari10.1+Chrome38+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js11.0.0+
MDN

TextEncoder/encode

In all current engines.

Firefox18+Safari10.1+Chrome38+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js8.3.0+
MDN

TextEncoder/encodeInto

In all current engines.

Firefox66+Safari14.1+Chrome74+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile50+
Node.js12.11.0+
MDN

TextEncoder/encoding

In all current engines.

Firefox18+Safari10.1+Chrome38+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js8.3.0+

TextEncoderStream/encoding

In all current engines.

Firefox105+Safari14.1+Chrome71+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js16.6.0+
MDN

TextEncoder

In all current engines.

Firefox18+Safari10.1+Chrome38+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js11.0.0+
MDN

TextEncoderStream/TextEncoderStream

In all current engines.

Firefox105+Safari14.1+Chrome71+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js16.6.0+
MDN

TextEncoderStream

In all current engines.

Firefox105+Safari14.1+Chrome71+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js18.0.0+