web-dev-qa-db-ja.com

UTF-8エンコード文字の最大バイト数は?

単一のUTF-8エンコード文字の最大バイト数は?

UTF-8でエンコードされた文字列のバイトを暗号化するため、UTF-8エンコードされた文字列の最大バイト数を計算できる必要があります。

誰かが単一のUTF-8エンコード文字の最大バイト数を確認してください

72
Edd

RFC3629 によると、文字あたりの最大バイト数は4です。これにより、文字テーブルはU+10FFFFに制限されます。

UTF-8では、U + 0000..U + 10FFFF範囲(UTF-16アクセス可能範囲)の文字は、1〜4オクテットのシーケンスを使用してエンコードされます。

(元の仕様では、U+10FFFFを超えるコードポイントに最大6バイトの文字コードを使用できました。)

コードが128未満の文字には1バイトのみが必要で、次の1920文字コードには2バイトのみが必要です。難解な言語で作業しているのでない限り、文字数に4を掛けることはかなりの過大評価になります。

78
Tamás

それ以上のコンテキストがなければ、UTF-8の文字の最大バイト数は

答え:6バイト

受け入れられた回答の著者は、これを「元の仕様」として正しく指摘しました。これは、RFC-2279 1 を介して有効でした。 J. Cocoeが以下のコメントで指摘したように、これは2003年にRFC-3629 2 で変更され、UTF-8を21ビットのエンコードに制限します。これは4バイトを使用するエンコードスキームで処理できます。

すべてのUnicodeをカバーする場合は答えます:4バイト

しかし、 Java <= v7 では、UTF-8でUnicodeを表すための最大3バイトについて話していますか?これは、元のUnicode仕様では基本的な多言語プレーン( [〜#〜] bmp [〜#〜] )のみが定義されていたためです。つまり、古いバージョンのUnicode、または最新のUnicodeのサブセットです。そう

元のユニコードのみを表す場合は答え、BMP:3バイト

しかし、OPはその逆について話します。文字からUTF-8バイトまでではなく、UTF-8バイトから「文字列」のバイト表現まで。おそらく、受け入れられた回答の著者は質問の文脈からそれを得たが、これは必ずしも明白ではないので、この質問のカジュアルな読者を混乱させるかもしれない。

UTF-8からネイティブエンコーディングに移行するには、「String」がどのように実装されているかを調べる必要があります。 Python> = 3のような一部の言語は、各文字を整数コードポイントで表します。これにより、文字ごとに4バイト= 32ビットで、ユニコードに必要な21をカバーできます。正確に21ビットではありませんか?バイト整列の方が高速であるためです。Python <= 2および Java などの一部の言語はUTF-16エンコードを使用して文字を表します。これは、サロゲートペアを使用して拡張ユニコード(BMPではない)を表す必要があることを意味します。いずれにしても、最大4バイトです。

uTF-8の場合は答える->ネイティブエンコーディング:4バイト

したがって、最終的な結論として、4が最も一般的な正しい答えであるため、我々はそれを正しました。ただし、走行距離は異なる場合があります。

30