2009-03-23 9 views
16

私の学習ガイド(70-536試験の場合)は、IO章の直後にあるテキストとエンコーディングの章でこれを2回言います。「.NETフレームワークは、デフォルトでUTF-16エンコーディング標準を使用します」とはどういう意味ですか?

これまでのすべての例は、FileStreamとStreamWriterを使用した単純なファイルアクセスと関連しています。

「ファイルを作成するときに使用するエンコーディングがわからない場合は、.NETでUTF16が使用されます」と「ストリームコンストラクターのオーバーロードを使用して別のエンコーディングを指定する」のように言います。

実際のオーバーロードがStreamWriterクラスにあることに気付かないでください。

私は現在リフレクターでStreamWriterを見ていますが、デフォルトはactaully UTF8NoBOMであることがわかります。

しかし、これは正誤表には記載されていません。それは古い本です(両方の版の誤字を犯された)ので、間違っていたら誰かがそれを取り上げたと思っていたでしょう.....

多分私はそれを理解していないと思う。

だから.....どのようなアイデアについて話しているのですか?デフォルトがある他の場所?

私はまったく混乱しています。

答えて

35

「UTF-16」は、迷惑な用語です。

最初の意味は、一連の16ビットコードポイントです。これらのほとんどは、同じ番号のUnicode文字に直接対応しています。 Basic Multilingual Plane(U + 10000以上)以外の文字は、それぞれSurrogatesの2つの16ビットコードポイントとして格納されます。

多くの言語では、この意味で内部記憶の目的でUTF-16を使用しています。これには、ネイティブ文字列型も含まれます。これは、 ".NET(またはJava)がデフォルトエンコーディングとしてUTF-16を使用する"のようなフレーズの通常のソースです。 .NETは、そのようなUTF-16文字列の要素を16ビットずつ(つまり実装レベルではuint16として)アクセスしています。

次に、ファイルまたはネットワークストリームに格納するために、このようなUTF-16文字列を線形バイトにエンコードすることを検討します。大きな数値をバイトに格納するときは常に、リトルエンディアンまたはビッグエンディアンの2つのエンコードが可能です。したがって、UTF-16のリトルエンディアンエンコーディングである「UTF-16LE」、またはビッグエンディアンエンコーディングである「UTF-16BE」を使用することができます。

( "UTF-16LE"がより一般的に使用されています)Windowsは、炎に混乱を与えるために、誤解を招くほど曖昧なエンコード名「Unicode」を与えています。 UTF-16LE/BEのファイルストレージとネットワークストリームの場合は8です)。

バイトの束に "UTF-16LE"か "UTF-16BE"が含まれているかどうかわからない場合は、最初のコードポイントを調べてそれを解決するトリックです。このコードポイントであるバイトオーダーマーク(BOM)は、一方向に読んだ場合にのみ有効です。したがって、一方のエンコーディングと他方のエンコーディングを間違えることはできません。

あなたが持っているバイトオーダーを気にせずにBOMを使ってこのシグナルを伝える方法は、通常エンコーディング名 "UTF-16"の下で呼ばれます。

誰かが「UTF-16」と言うと、短いUnicodeコードポイントのシーケンスか、1つにデコードする不特定の順序のバイトシーケンスを意味するのかを判断できません。

(「UTF-32」は同じ問題を抱えている。)

If you don't know what encoding to use when you create a file, don't specify one and .NET will use UTF16

それはそれは嘘です、実際の直接の引用だ場合。あなたにUTF-8を与えるために、符号化引数なしでStreamWriterを構築するis explicitly specified

+1

+1この素晴らしい返信のためにうれしい感謝。私は消化する。もし私が2回投票することができたら、私は:)。 –

2

UTF16は、.NETが(文字列変数などの)プログラム内の文字列をエンコードするために使用するデフォルトのエンコードです。

3

テストします。文字列 "abcd"をファイルに書き込みます。 UTF8を使用する場合、ファイルのサイズは4バイトになります。 UTF16では、8バイトになります。それは簡単に混乱している二つの意味を有するもの(プラスおそらくBOM)

+0

Strea StreamWriterのエンコーディングをブレークポイントしてチェックすることでmWriter - UTF8NoBOMでした。これらの例はすべてこのように行われており、本の内容は詳しくは書かれていないので、私は彼らが何をしているのか理解できませんでした。 –

+0

StreamWriterが使用するエンコーディングを指定する必要があります。 –

2

この問題は静的なSystem.IO.Fileクラスで発生しました。

ファイルにUTF-16 XMLを含む文字列を書きたいと思っていました。

まず、私は

using(StreamWriter writer = File.CreateText(xmlFilePathTarget)) 
{ 
    writer.Write(xmlString); 
} 

を使用しかし、それはUTF-8などの文字列を書いたので、IEはそれを開くとエラーが表示されていないでしょう。大部分は、この記事への

The XML page cannot be displayed Cannot view XML input using style sheet. Please correct the error and then click the Refresh button, or try again later.


Switch from current encoding to specified encoding not supported. Error processing resource 'file:///C:/Documents and Setti...

おかげで、Iソリューションが明示的にStreamWriterコンストラクタを使用していたことが判明しました。

StreamWriter writer = new StreamWriter(xmlFilePathTarget, false, Encoding.Unicode));