4

私が読んだ場所(言い換え):

UTF-8でエンコードされたファイルとUTF-16でエンコードされたファイルを比較すると、UTF-8ファイルのファイルサイズが50%から100%大きくなる場合があります。

常に、UTF-8でエンコードされたテキストがUTF-16でエンコードされた同じテキストの+ 50%を超えるファイルサイズを提供することは決してないので、記事が間違っていると言うのは正しいですか?

4

4 に答える 4

26

答えは、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にあります。各列の意味は次のとおりです。

  1. Parasは、空白行で区切られたテキストスパンの数です。
  2. 行数は、改行で区切られたテキストスパンの数です。
  3. 単語は、空白で区切られたテキストスパンの数です。
  4. グラフは、Unicode拡張書記素クラスターの数であり、グリフと呼ばれることもあります。これらはユーザーに表示される文字です。
  5. Charsは、Unicodeコードポイントの数です。これらは、プログラマーに表示される文字であるか、そうである必要があります。
  6. UTF16は、ファイルがUTF-16として格納されるときに使用するバイト数です。
  7. UTF8は、ファイルがUTF-8として保存されるときに使用するバイト数です。
  8. 8:16は、UTF-8サイズとUTF-16サイズの比率であり、パーセンテージで表されます。
  9. 16:8は、UTF-16サイズとUTF-8サイズの比率であり、パーセンテージで表されます。
  10. 言語は、ここで話している東京ページのバージョンです。

言語を西ラテン語、西部非ラテン語、および東部にグループ化しました。観察:

  1. ラテン文字を使用する西洋言語は、UTF-8からUTF-16に変換するとひどく苦しみます。英語は、96%拡大することで最も苦しみ、ハンガリー語は80%拡大することで最も苦しみます。すべてが巨大です。

  2. ラテン文字を使用しない西洋言語は依然として苦しんでいますが、15〜20%にすぎません。

  3. 東部の言語は、誰もが主張するようにUTF-8で苦しむことはありません!見よ:

    • 韓国語と(簡略化された)中国語では、UTF-16よりもUTF-8の方がわずか6%大きくなります。
    • 日本語では、UTF-16よりもUTF-8の方が29%大きくなります。
    • 繁体字中国語は、実際にはUTF-16よりもUTF-8の方が小さくなっています。実際、このサンプルでUTF-8よりもUTF-16を使用する場合は32%のコストがかかります。Lines列とWords列を見ると、これは空白の使用が原因である可能性があります。

それがあなたの質問に答えることを願っています。これらの同じテキストがUTF-16でエンコードされている場合と比較して、UTF-8でエンコードされている場合、東部言語のサイズが+ 50%から+ 100%増加することはありません。個々のコードポイントを取得する場合にのみ、そのような数値が表示されます。これは完全に不合理なメトリックです。

于 2011-07-30T17:02:17.183 に答える
10

はい。それで合っています。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
于 2011-08-10T08:47:50.893 に答える
2

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と文字セットについて知っている必要があります(言い訳はありません!)

于 2011-07-30T13:45:48.497 に答える
0

文字に1バイトがあり、2番目のバイトを追加する場合、50%ではなく100%の増加と呼びます。それが作者の意味だと思います。

バイト/文字の文字をファイルに書き込むと、そのファイルにXバイトが含まれます。したがって、1文字あたりのバイト数を2倍または3倍にすると、ファイルのサイズに線形の影響があることがわかります。NNX

于 2011-07-30T13:40:48.223 に答える