3

シナリオ

スペースが問題にならないデータベースまたはサーバーに、UTF-16 として保存されている XML ファイルが多数あります。XML ファイルとして他のシステムに取得する必要があるこれらのファイルの大部分を取得する必要があり、できるだけ少ないスペースを使用することが重要です。

問題

実際には、UTF-16 として保存されるファイルのうち、UTF-16 として保存する必要があるのは約 10% のみであり、残りは UTF-8 として安全に保存でき、問題ありません。UTF-16 にする必要があるものだけを UTF-8 にして、残りを UTF-8 にすることができれば、ファイル システムで使用するスペースを約 40% 減らすことができます。

データの優れた圧縮を使用しようとしましたが、これは便利ですが、UTF-16 で得られるのと同じ圧縮率が UTF-8 で得られ、UTF-8 圧縮も高速であることがわかりました。したがって、最終的にできるだけ多くのデータを UTF-8 として保存すると、非圧縮で保存するときにスペースを節約できるだけでなく、圧縮してもさらにスペースを節約でき、圧縮自体で時間を節約することさえできます。 .

ゴール

XML ファイルに UTF-16 を必要とする Unicode 文字が含まれている場合を把握し、必要な場合にのみ UTF-16 を使用できるようにします。

XML ファイルとデータに関する詳細

XML 自体のスキーマは制御しますが、ソースは使用する Unicode データを自由に提供できるため、Unicode の観点から値に入れることができる「文字列」のタイプは制御しません。ただし、これはまれであるため、10% の頻度でしか必要とされないものをサポートするために、毎回 UTF-16 を使用する必要はありません。

開発環境

.Net Framework 4.0 で C# を使用しています。

編集:解決策

解決策は、UTF-8 を使用することです。

この質問は、私の UTF の誤解に基づいていました。ありがとうございました!

4

5 に答える 5

7

編集:あなたの質問が、UTF-8として安全にエンコードできないUnicode文字列があるとあなたが考えていることを意味していることに気づきませんでした。これはそうではありません。次の答えは、UTF-8のように、一部の文字列が単純に長くなる(より多くのストレージスペースを使用する)ということを実際に意味していることを前提としています。


ファイルの10%未満でもUTF-16として保存する必要があると思います。XMLに大量の中国語、日本語、韓国語、またはUTF-16よりもUTF-8の方が大きい別の言語が含まれている場合でも、その言語にXML構文よりも多くのテキストがある場合にのみ問題になります。

したがって、私の最初の直感は「問題が発生するまでUTF-8を使用する」ことです。一貫性もあります。

XMLの大部分が東アジアであると信じる重大な理由がある場合にのみ、それについて心配する必要があります。その場合、次のような単純なヒューリスティックを適用します... XMLを調べて、U + 0800(UTF-8では3バイト)より大きい文字数をカウントします。これは、 U + 0080未満の文字(UTF-8では1バイト)は、UTF-16を使用します。

于 2010-09-16T22:59:30.827 に答える
6

すべてを UTF-8 でエンコードします。UTF-8 は UTF-16 が処理できるものなら何でも処理でき、XML 文書の場合はほぼ確実に小さくなります。UTF-8 が UTF-16 よりも大きくなる唯一のケースは、ファイルの大部分が BMP を超える文字で構成されている場合であり、最良の場合 (標準の US で入力できるすべての文字を含む ASCII 仕様) 104-key) UTF-8 ファイルは UTF-16 の半分のサイズになります。

UTF-8 では、序数 U07FF 以下のすべてのシンボルに対して文字あたり 2 バイト以下が必要であり、拡張 ASCII コードページの任意の文字に対して 1 バイトが必要です。つまり、一般的な記号のほとんどを含む、ラテン語、ギリシャ語、キリル文字、ヘブライ語、またはアラビア語のアルファベットを使用する現代言語のドキュメントの場合、UTF-8 はサイズが少なくとも UTF-16 と同じ (そしておそらくはるかに小さい) になります。代数と IPA で使用されます。これは Base Multilingual Plane として知られており、アジア以外のすべての公用語の 90% 以上を網羅しています。

原則として、UTF-16 は、デーバナーガリー語 (ヒンディー語)、日本語、中国語、またはハングル (韓国語) のアルファベット、または古代または「難解な」アルファベット (チェロキー族またはイヌイット族のいずれか) で主に記述されたドキュメントのファイルを小さくします。 ?)、特殊な数学、科学、工学、またはゲームの記号を頻繁に使用するドキュメントの場合は、サイズが小さくなる場合があります。作業している XML がインド、中国、および日本のローカリゼーション ファイル用である場合、UTF-16 を使用するとファイル サイズが小さくなる可能性がありますが、ローカリゼーション ファイルがそのようにエンコードされていることを認識できるようにプログラムを賢くする必要があります。 .

于 2010-09-17T00:52:10.540 に答える
5

UTF-8の代わりにUTF-16を使用する必要はありません。選択は「安全性」ではありません。両方のエンコーディングには、同じエンコード可能な文字レパートリーがあります。

于 2010-09-16T22:59:51.163 に答える
4

UTF-16でなければならないドキュメントのようなものはありません。UTF-16ドキュメントはUTF-8としてエンコードすることもできます。理論的には、UTF-16よりもUTF-8の方が大きいドキュメントを作成することは可能ですが、これはほとんどあり得ないことであり、強調する価値はありません。

すべてをUTF-8としてエンコードし、心配する必要はありません。

于 2010-09-16T23:04:19.687 に答える
1

UTF-8ではなくUTF-16を必要とする文字はありません。UTF-8とUTF-16の両方(さらに言えば、UTF-32とその他の非推奨フォーマット)は、UCS全体をエンコードできます(これがUTFの意味です)。

UTF-8よりもUTF-16の方が小さいストリームがいくつかあります。ただし、実際には、そのようなストリームには、言語的に非常に簡潔なアジアの表意文字が主に含まれます。ただし、XMLには、特定の意味を持つ0x20〜0x7Fの範囲の文字が必要であり、要素名と属性名にアルファベットベースのスクリプトを使用することがよくあります。

前述のこれらの表意文字の簡潔さのために、XMLタグ(要素名と属性名、および小なり小なり、大なりを含む)と人間が設定したテキストの比率は、アルファベットや音節文字を使用する言語よりもはるかに高くなります。このため、UTF-16のプレーンテキストがUTF-8の同じテキストよりもかなり小さい場合でも、XMLに関しては、この差が小さくなるか、UTF-8はさらに小さくなります。

原則として、送信と保存にはUTF-8を使用します。

編集:あなたも圧縮していることに気づきました。その場合、バランスはさらに重要ではありません。UTF-8を使用してそれを実行するだけです。

于 2010-09-16T23:08:55.827 に答える