web-dev-qa-db-ja.com

UTF-8「可変幅エンコーディング」はどのように機能しますか?

Unicode標準には十分なコードポイントが含まれているため、すべてを保存するには4バイトが必要です。これがUTF-32エンコーディングの機能です。しかし、UTF-8エンコーディングでは、「可変幅エンコーディング」と呼ばれるものを使用して、これらをより小さなスペースに圧縮しています。

実際、US-ASCIIの最初の127文字を実際のASCIIとまったく同じ1バイトで表すことができるため、多くのASCIIテキストを何もせずにUTF-8であるかのように解釈できます。きちんとしたトリック。それでは、どのように機能しますか?

ここで自分自身の質問に答えてみましょう。それを理解するために少し読んだだけで、他の人を救うかもしれないと思ったからです。それに、もし私がそれを間違っていたら、誰かが私を修正できるかもしれません。

98
dsimard

各バイトは、シングルバイトのコードポイント、マルチバイトのコードポイント、またはマルチバイトのコードポイントの継続かどうかを示す数ビットで始まります。このような:

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

最初の数ビットから見ているバイトの種類がわかるので、どこかで何かが壊れてもシーケンス全体を失うことはありません。

118
dsimard

RFC3629-ISO 8646の変換フォーマットであるUTF-8 は、ここでの最終的な権限であり、すべての説明があります。

要するに、単一文字を表すUTF-8エンコードの1バイトから4バイトのシーケンスの各バイトのいくつかのビットは、後続バイトであるか、先行バイトであるか、そうである場合は続くバイト数を示すために使用されます。残りのビットにはペイロードが含まれます。

8
azheglov

UTF-8は、Unicodeコードポイントの文字列である魔法のU +番号を8ビットバイトを使用してメモリに保存するための別のシステムでした。 UTF-8では、0〜127のすべてのコードポイントが1バイトに格納されます。コードポイント128以上のみが、実際には2、3、最大6バイトを使用して保存されます。

すべてのソフトウェア開発者がUnicodeおよび文字セットについて絶対的かつ積極的に知っておくべき絶対最小値(言い訳なし!) からの抜粋

3
Andrew