2012-03-02 2 views
54

1つのUTF-8エンコード文字の最大バイト数はいくらですか?UTF-8エンコード文字の最大バイト数はいくらですか?

私はUTF-8でエンコードされたStringのバイトを暗号化しているので、UTF-8でエンコードされたStringの最大バイト数を計算する必要があります。

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

+1

あなたは[WikipediaのUTF-8記事](http://en.wikipedia.org/wiki/UTF-8)などの共通のリソースを最初に見ていますか? –

+3

私はいくつかの記事を読んだ...私は本当に答えが3だったので、私はとても嬉しく思った。 – Edd

+1

Tom Scottの文字、記号、ユニコードの奇跡を特集したyoutube linkを残す:https: //goo.gl/sUr1Hf。 ASCII文字エンコーディングからutf-8まで、すべてがどのように進化しているのかを聞くことができます。 – Roylee

答えて

61

文字当たりの最大バイト数は4であるU+10FFFFに文字テーブルを限定RFC3629に従って:

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

U+10FFFF過去のコードポイントの最大6つのバイトの文字コードに許可元の仕様。)128は、1バイトのみを必要とするであろう、そして次1920の文字コードが2を必要とするより少ないコードで

文字バイトのみ。難解な言語を使って作業している場合を除き、文字数に4を掛けた値は大きな過大評価になります。さらにコンテキストなし

+2

あなたのために「エソテリック言語」とは何ですか?現実世界に存在するあらゆる言語、または世界の異なる言語を切り替えるテキスト? UTF-8-to-String関数の開発者は、過剰配分を行い、実際の変換後に結果をダウンサイジングする場合、2、3、または4を乗算器として選択する必要がありますか? –

+1

@inntech by 'esoteric language'彼は、非常に価値の高いユニコード文字(このリストの一番下にあるもの:http://unicode-table.com/en/sections/)を多く含む言語を意味します。過剰割り当てが必要な場合は、4を選択します。ダブルパスが必要です.1つは必要なバイト数を確認し、もう1つはエンコードを行います。必要なRAMの約4倍を割り当てるよりも良いかもしれません。 – matiu

+4

常に最悪の場合を処理してください:http://www.hacker9.com/single-message-can-crash-whatsapp.html –

22

、私はUTF-8の文字の最大バイト数は

が答えであることを言う:6バイト

受け入れ答えの作者が正しくとしてこれを指摘しました」私が知る限り、これはまだwikipedia、およびa Google book on UTF-8 in Javaごとに現在の正しい仕様ですので、これは読者を誤解させると思います。

それはUTF-するUTF-16の文字だけを変換する場合、我々はコンテキスト

答えを追加した場合にのみ正確であるように、唯一の4バイトは、UTF-16エンコーディングに関連する受け入れ答え状態で参照RFC 8:4バイト

ここで、UTF-16で表現できる文字はどれも有益でしょうか? wikipedia againによれば、ユニコードは最大10ポイントのコードポイントを表すことができます。したがって、0を含めて、つまり、これらのバイトで行うことができます:F FF FF、つまり2バイト半、つまり20ビット。 UTF-8仕様を振り返ると、UTF-8でエンコードされた最大4つのバイトで20ビットを表現できることがわかります。だから、

答えすべてのUnicodeカバーする場合:Java <= v7で、4バイト

しかしを、彼らはUTF-8でUnicodeを表現するための3バイトの最大の話を?オリジナルのユニコード仕様では、基本的な多言語面(BMP)しか定義されていませんでした。つまり、古いバージョンのユニコードまたは現代のユニコードのサブセットです。だから、

答えだけのオリジナルユニコード、BMP表す場合:3バイト

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

UTF-8からネイティブエンコーディングに移行するには、 "String"の実装方法を調べる必要があります。 Python> = 3のようないくつかの言語は、各文字を整数コードポイントで表現します。これは、1文字当たり4バイト= 32ビットがUnicodeに必要な20ビットをカバーすることを可能にします。なぜちょうど20ビットではないのですか?バイト整列されていると処理が速くなるためです。 Python < = 2およびJavaのような言語は、UTF-16エンコーディングを使用する文字を表します。つまり、拡張ユニコード(BMPではなく)を表すサロゲートペアを使用する必要があります。いずれにせよ、それはまだ最大4バイトです。

答えUTF-8に行く場合 - >ネイティブエンコーディングを:4バイト

だから、最終的な結論、4が最も一般的な正しい答えであるので、我々は右のそれを得ました。しかし、特定の状況では注意する必要があります。例えば、あなたがUTF-8ストリームから読み込んだものを最大4バイトで表現できるとは期待しないでください。ユニコードでない場合は、最大6バイト必要です。

+1

"これは今でもWikipediaの現在の正しい仕様です" - これ以上はありません。ウィキペディアのUTF-8記事は、6オクテットのバージョンが現在の(2003年)UTF-8仕様の一部ではないことを明確にするために変更されました。 –

+0

"しかし、Java <= v7では、UTF-8でユニコードを表現するために3バイトの最大値があるのですか?元のユニコード仕様では基本的なマルチ言語プレーンしか定義されていないからです。それは全体の話ではありません。 Javaは「変更されたUTF-8」を使用し、変更の1つは「標準UTF-8の4バイト形式」(その言葉)の代わりに「独自の2倍3バイト形式」を使用することです。 –

+0

10FFFF(単なる100万を超える)の限界を超えて割り当てられたコードポイントはなく、多くのUTF8実装では4バイト(そしてMySQLのような3バイトしか使用できません)というシーケンスは実装されませんでした。古い実装との互換性を考慮してもコードポイントごとに途中で何か無効なものを捨てるようにする必要があります。正確なバイト長を計算した後でmatiuが割り当てることをお勧めします。 – thomasrutter

関連する問題