1. ホーム
  2. unicode

[解決済み] UTF-8の「可変幅エンコーディング」はどのように機能するのですか?

2022-09-03 03:57:54

質問

ユニコード規格には十分な数のコードポイントがあり、それらをすべて格納するためには4バイトが必要です。 これは、UTF-32 エンコーディングが行っていることです。 しかし、UTF-8 エンコーディングは、可変幅エンコーディングと呼ばれるものを使用して、これらをはるかに小さなスペースに押し込んでいます。

実際、US-ASCII の最初の 127 文字を、本物の ASCII とまったく同じように見える 1 バイトで表現することに成功しており、多くの ascii テキストを何もせずに UTF-8 であるかのように解釈することができます。 すてきなトリックですね。 では、どのように動作するのでしょうか。

私はここで自分自身の質問をし、それに答えるつもりです。なぜなら、私はそれを理解するために少し読みましたし、他の誰かの時間を節約できるかもしれないと思ったからです。 それに、もし私が間違っていたら、誰かが訂正してくれるかもしれません。

どのように解決するのですか?

各バイトは、それが1バイトのコードポイントなのか、マルチバイトコードポイントなのか、マルチバイトコードポイントの続きなのかを示す数ビットで始まります。 このように

0xxx xxxx    A single-byte US-ASCII code (from the first 127 characters)

マルチバイトのコードポイントはそれぞれ、「私が何であるかを理解するには、次のバイト(または2つ、または3つ)も読む必要があります」と本質的に言ういくつかのビットで始まります。

110x xxxx    One more byte follows
1110 xxxx    Two more bytes follow
1111 0xxx    Three more bytes follow

最後に、これらの開始コードに続くバイトは、すべて次のようになります。

10xx xxxx    A continuation of one of the multi-byte characters

最初の数ビットでどのようなバイトかわかるので、どこかで何かがおかしくなっても、シーケンス全体が失われることはないのです。