HN 日本語サマリー

← 一覧へ戻る
プログラミング

UTF-8000: 無制限のUTF-8

UTF-8000: Unlimited UTF-8 (utf-8000.jb2170.com)

48 pointsby vismit200027 コメント

要約

この記事は、UTF-8エンコーディングの拡張概念である「UTF-8000」について解説しています。UTF-8000は、従来のUTF-8が持つ最大6バイトという制限を超え、理論上任意の長さのコードユニットを生成できる可能性を示唆しています。記事では、UTF-8000のバイト構造、自己同期プレフィックス、スタートビット、継続バイトといった概念を、図や用語集を用いて詳細に説明し、その設計思想と利点を解説しています。

全文翻訳

TLDR / 例 ASCII 1 0xxxxxxx UTF-8 2 110xxxxx 10xxxxxx UTF-8 3 1110xxxx 10xxxxxx 10xxxxxx UTF-8 4 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx UTF-8000 5 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx UTF-8000 6 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx UTF-8000 7 11111110 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx UTF-8000 8 11111111 100xxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx UTF-8000 9 11111111 1010xxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx UTF-8000 10 11111111 10110xxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx ... UTF-8000 22 11111111 10111111 10111111 10110xxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx ... 10xxxxxx ... ここにある22バイトのコードユニットの例には、特別なケースはありません。それは、複数の開始バイトを持つUTF-8000の力を実証する、良い典型的な例にすぎません。UTF-8から継承された特別なケースは2つだけです。ASCIIはそのまま、そして2バイトUTF-8は、他の長いコードユニットが5ビットであるのに対し、オーバーロングエンコーディングに対してチェックするための4つの必須コンテンツビットを持っています。 解剖 TLDRの22バイトコードユニットの例の解剖図を以下に示します。用語の詳細については、用語集を参照してください。 4バイト目はエキサイティングです!それは継続バイトであり、開始バイトであり、最終開始バイトであり、コンテンツビットを持ち、そして一部の必須コンテンツビットのみを持ち、それらは最終開始バイトと最初の非開始バイトにまたがっています。 UTF-8000仕様の主な貢献は、UTF-8コードユニットの最初のバイトの最上位ビットを自己同期ビットと開始ビットに分割することの明確さであり、その後、必要に応じて開始ビットを継続バイトにストライプする方法を明確にすることで、任意の大きなコードユニットを実現することです。 用語集 これらの用語は、アルファベット順ではなく、便宜上、最初の要件の時系列順に並べられています。定義内で使用されている用語は、下線付きのクリック可能なハイパーリンクです。 用語 定義 コードポイント 非負整数、別名符号なし整数。 コードユニット 単一のコードポイントをエンコードするUTF-8000バイトのシーケンス。 最初のバイト UTF-8000コードユニットを開始する、唯一の最初のバイト。最初のバイトの自己同期プレフィックスは、ASCIIの場合は0、マルチバイトコードユニットの場合は11です。この用語は開始バイトと同義ではありません。最初のバイトは必然的に開始バイトですが、その逆はありません。このため、最初のバイトは最初の開始バイトとも呼ばれます。 興味深い観察:自己同期プレフィックス0のため、ASCIIバイトの上の16進数ニブルは、0、1、2、3、4、5、6、7のいずれかしかできません。この用語は、自己同期のため、継続バイトとは相互に排他的です。 継続バイト マルチバイトUTF-8000コードユニットの最初のバイト以降のバイト。継続バイトの自己同期プレフィックスは10であり、継続プレフィックスビットとも呼ばれます。 興味深い観察:自己同期プレフィックス10のため、継続バイトの上の16進数ニブルは、8、9、A、Bのいずれかしかできません。この用語は、自己同期のため、最初のバイトとは相互に排他的です。 自己同期プレフィックス それが最初のバイトか継続バイトかを示す、すべてのUTF-8000バイトの最上位ビット。可能な自己同期プレフィックスは、プレフィックスフリーツリーを形成します。 .----0 ASCIIの最初のバイト `----1---0 マルチバイトUTF-8000の継続バイト `----1 マルチバイトUTF-8000の最初のバイト UTF-8000が継承するUTF-8の巧妙なアーキテクチャの一部であるこの部分は、バイトレベルでの自己同期のプロパティを提供します。これらの最上位ビットを見るだけで、それがどのような種類のバイトであり、コードユニットのどこに属するかを即座に判断できます。これは、UTF-8000でエンコードされたファイルのパートをデコードする際に最も役立ちます。ファイルをUTF-8000でエンコードされた任意の位置にランダムにシークした場合、新しいコードユニットのデコードを開始できる最初のバイトにいるのか、それともデコードを開始するために次の最初のバイトを見つけるために少し先にシークする必要がある継続バイトにいるのかを、曖昧さなく判断できます。また、シークしたバイトのコンテキストやグローバル状態を発見するために、シーク位置より前のバイトを処理する必要もありません。最初のバイトは、その自己同期プレフィックスが0または11のいずれかであることから推測できるため、どこに現れても常に曖昧さなく最初のバイトです。これはランダムアクセスだけでなく、エラー回復にも役立ちます。 UTF-8000バイトのエラーを起こしやすいストリームをデコードしていて、エラー(例:不正な0xC0バイト)が発生した場合に、すぐに終了するのではなく、「落ち着いて続行」したいとします。Unicode置換文字U+FFFD �を生成し、その間に何かを破棄して、次の最初のバイトを待つことができます。一般的な情報については、自己同期コードに関するWikipediaの記事を参照してください。 これらのビットは明るいシアンでハイライトされています。 開始バイト 1つ以上の開始ビットを含むバイト。開始バイトは、UTF-8000コードユニットの先頭に連続して存在します。UTF-8000の力は、複数の開始バイトを持つことで、任意のコードユニット長を達成し、任意の大きなコードポイントをエンコードできることです。コードユニットの先頭付近のバイトについて話す場合、ASCIIバイトには開始ビットがありませんが、ASCIIを開始バイトとして慣習的に含めることが賢明な場合もあります。ASCII以外のコードユニットには、少なくとも1つの開始バイトがあります。最初の開始バイトは最初のバイトであり、開始バイトでもある継続バイトがゼロ個以上続きます。したがって、UTF-8000コードユニットは複数の開始バイトを持つことができるため、この用語は最初のバイトと同義ではありません。UTF-8のみに制限した場合、この用語は最初のバイトと同義です。これは、現在のUTF-8標準(RFC 3629 (2003))で最大4バイトを使用する場合でも、以前の標準(RFC 2044 (1996) および RFC 2279 (1998))で最大6バイトを使用する場合でも、UTF-8長コードユニットは1つの開始バイトしか必要としないためです。 開始ビット マルチバイトUTF-8000コードユニットの開始バイトに含まれる単項コードシーケンスで、コードユニットのバイト長を示します。nバイトで構成されるコードユニットの場合、開始ビットはn-2個の1ビットの後に終端の0ビットが続きます。明確にするために、開始ビットにはこの終端のゼロビットが含まれます。したがって、開始ビットシーケンスは長さn-1で、111...10のように見えます。可能な開始ビットシーケンスは、プレフィックスフリーツリーを形成します。 .----0 2バイトUTF-8 `----1---0 3バイトUTF-8 `----1---0 4バイトUTF-8 `----1---0 5バイトUTF-8000 `----... nバイトUTF-8000 n < 8 のnバイトコードユニットの場合、開始ビットはすべて最初のバイトにきれいに収まります。それ以外の場合は、継続プレフィックスビットで占有されていない空きビットを埋めながら、必要な最初の数バイトにストライプされます。 これもUTF-8の巧妙なアーキテクチャの一部であり、UTF-8000が継承するもので、自己句読点(プレフィックスコードまたはプレフィックスフリーコードとも呼ばれる)のプロパティを提供します。マルチバイトコードユニットをデコードする際に、開始バイトの終わりに到達すると(つまり、終端の0ビットに遭遇すると)、そのコードユニットに何バイトを期待するかを正確に知ることができます。エラーに関係なく、そのバイト数だけを読み取り、それ以上は読み取らないことで、コードユニットのデコードに成功できます。これは、コードユニットの長さが固有に示されていない、より単純な可変長エンコーディングの問題を回避します。現在のコードユニットがいつ終了したかを知るには、コードユニットの最後のバイトを超えて読み取る必要があります。つまり、次のコードユニットの最初のバイトを読み取る必要があります。 自己同期も自己句読点も持たない非常に単純なエンコーディングでは、ランダムアクセスを可能にするために、コードユニットの区切りを示すために、コードユニット間にコンマバイトのような専用の補助バイトを配置する必要があります。 プレフィックスコードおよび単項コーディングに関するWikipediaの記事を参照してください。 この用語は、coと相互に排他的です。