私が読んだ場所(言い換え):
UTF-8でエンコードされたファイルとUTF-16でエンコードされたファイルを比較すると、UTF-8ファイルのファイルサイズが50%から100%大きくなる場合があります。
常に、UTF-8でエンコードされたテキストがUTF-16でエンコードされた同じテキストの+ 50%を超えるファイルサイズを提供することは決してないので、記事が間違っていると言うのは正しいですか?
私が読んだ場所(言い換え):
UTF-8でエンコードされたファイルとUTF-16でエンコードされたファイルを比較すると、UTF-8ファイルのファイルサイズが50%から100%大きくなる場合があります。
常に、UTF-8でエンコードされたテキストがUTF-16でエンコードされた同じテキストの+ 50%を超えるファイルサイズを提供することは決してないので、記事が間違っていると言うのは正しいですか?
答えは、UTF-8ではASCIIはわずか1バイトですが、一般に、英語を含むほとんどの西洋言語は、2バイトを必要とする数文字をあちこちで使用するため、実際のパーセンテージは異なります。ギリシャ語とキリル文字はすべて、UTF-8でエンコードする場合、スクリプトの文字ごとに少なくとも2バイトを必要とします。
一般的な東部言語では、文字にUTF-8では3バイトが必要ですが、UTF-16では2バイトが必要です。ただし、「珍しい」東部文字は、UTF-8とUTF-16の両方で同様に4バイトを必要とすることに注意してください。
3は確かに2より50%大きいだけです。しかし、それは単一のコードポイントのみです。ファイル全体には適用されません。
コードのバランスが1バイトまたは2バイトのUTF-8の範囲にあるのか、4バイトのUTF-8の範囲にあるのかがわからないため、実際のパーセンテージを正確に示すことはできません。アジアのテキストに空白がある場合、それはUTF-8の1バイトだけですが、それでもUTF-16の2バイトのコストがかかります。
これらは異なります。正確な数値は、一般的なテキストではなく、正確なテキストでのみ取得できます。アジアのテキストのコードポイントは、1、2、3、または4バイトのUTF-8を使用しますが、UTF-16では、それぞれ2または4バイトを必要とします。
東京のさまざまな言語のウィキペディアのページを比較して、私が何を意味するかを確認してください。東部の言語でさえ、まだたくさんのASCIIが進行中です。これだけであなたの数字は変動します。検討:
Paras Lines Words Graphs Chars UTF16 UTF8 8:16 16:8 Language
519 1525 6300 43120 43147 86296 44023 51% 196% English
343 728 1202 8623 8650 17302 9173 53% 189% Welsh
541 1722 9013 57377 57404 114810 59345 52% 193% Spanish
529 1712 9690 63871 63898 127798 67016 52% 191% French
321 837 2442 18999 19026 38054 21148 56% 180% Hungarian
202 464 976 7140 7167 14336 11848 83% 121% Greek
348 937 2938 21439 21467 42936 36585 85% 117% Russian
355 788 613 6439 6466 12934 13754 106% 94% Chinese, simplified
209 419 243 2163 2190 4382 3331 76% 132% Chinese, traditional
461 1127 1030 25341 25368 50738 65636 129% 77% Japanese
410 925 2955 13942 13969 27940 29561 106% 95% Korean
これらはそれぞれ、HTMLではなくテキストとして保存された東京ウィキペディアのページです。 すべてのテキストはNFDではなくNFCにあります。各列の意味は次のとおりです。
言語を西ラテン語、西部非ラテン語、および東部にグループ化しました。観察:
ラテン文字を使用する西洋言語は、UTF-8からUTF-16に変換するとひどく苦しみます。英語は、96%拡大することで最も苦しみ、ハンガリー語は80%拡大することで最も苦しみます。すべてが巨大です。
ラテン文字を使用しない西洋言語は依然として苦しんでいますが、15〜20%にすぎません。
東部の言語は、誰もが主張するようにUTF-8で苦しむことはありません!見よ:
それがあなたの質問に答えることを願っています。これらの同じテキストがUTF-16でエンコードされている場合と比較して、UTF-8でエンコードされている場合、東部言語のサイズが+ 50%から+ 100%増加することはありません。個々のコードポイントを取得する場合にのみ、そのような数値が表示されます。これは完全に不合理なメトリックです。
はい。それで合っています。U + 0800..U + FFFFの範囲のコードポイントは、+ 50%のサイズになります。
UTF-8 UTF-16
U+0000..U+007F 1 2
U+0080..U+07FF 2 2
U+0800..U+FFFF 3 2
U+010000..U+10FFFF 4 4
UTF-8では、0から127までのすべてのコードポイントが1バイトに格納されます。128以上のコードポイントのみが2、3、実際には最大6バイトを使用して格納されます。
UTF-8文字は最大4バイトを使用できますが(理論的にはそれ以上が可能です)、「ほとんどすべての現代言語」を含む基本多言語面には使用されません。
残りの基本多言語面(一般的に使用される実質的にすべての文字を含む)には3バイトが必要です。Unicodeの他のプレーンの文字には、4バイトが必要です。これには、あまり一般的ではないCJK文字やさまざまな履歴スクリプトが含まれます。
したがって、理論的には可能ですが、一般的な現代語では100%のオーバーヘッドは不可能だと思います。これを実現するには、UTF-8で4バイトを使用するSupplementaryMultilingualPlaneのエキゾチックなものを使用する必要があります。
HTMLドキュメントまたは混合テキストの場合、スペースを節約するためにUTF-16に切り替える必要がない場合があります。
文字U+0800からU+FFFFは、UTF-8では3バイトを使用しますが、UTF-16では2バイトしか使用しません。その結果、(たとえば)中国語、日本語、またはヒンディー語のテキストは、ASCII文字よりもこれらの文字の数が多い場合、UTF-8でより多くのスペースを占める可能性があります。これは純粋なテキストで発生しますが、HTMLドキュメントではめったに発生しません。たとえば、ウィキペディアの日本語UTF-8とヒンディー語Unicodeの両方の記事は、元のUTF-8バージョンよりもUTF-16として保存すると、より多くのスペースを必要とします。
ウィキペディアのUTF-8とUTF-16の比較を参照してください。
Joel Spolskyは、Unicodeに関するすばらしい記事を書きました。私は、それを本当にお勧めできます。
絶対最小すべてのソフトウェア開発者は絶対に、積極的にUnicodeと文字セットについて知っている必要があります(言い訳はありません!)
文字に1バイトがあり、2番目のバイトを追加する場合、50%ではなく100%の増加と呼びます。それが作者の意味だと思います。
バイト/文字の文字をファイルに書き込むと、そのファイルにX
バイトが含まれます。したがって、1文字あたりのバイト数を2倍または3倍にすると、ファイルのサイズに線形の影響があることがわかります。N
NX