2012-04-03 11 views
8

文字エンコーディングに問題があります。私が手UTF32とC#の問題

System.IO.StreamReader streamReader = 
    new System.IO.StreamReader("input", System.Text.Encoding.UTF32, false); 
System.IO.StreamWriter streamWriter = 
    new System.IO.StreamWriter("output", false, System.Text.Encoding.UTF32); 

streamWriter.Write(streamReader.ReadToEnd()); 

streamWriter.Close(); 
streamReader.Close(); 

鸕 
鸕 

(同じ文字、その後

し、それらにこのコードを実行します。私はUTF32エンコードされたテキストファイルに、次の2つの文字を入れて 2回、つまり入力ファイル!=出力)

参考になるもの: Hexが最初の文字のために:

15 9E 02 00

そして第二のために:

15 9E 00 00

私は、テキストファイルを作成するためのC#のためのモノをgeditのを使用しています私はUbuntuを使用しています。

入力ファイルまたは出力ファイルのエンコーディングを指定しても問題ありません。UTF32エンコーディングであれば、それは好きではありません。入力ファイルがUTF-8エンコーディングの場合に機能します。次のように

入力ファイルは次のとおりです。

FF FE 00 00 15 9E 02 00 0A 00 00 00 15 9E 00 00 0A 00 00 00

それはバグですか、それは私だけでしょうか?

ありがとうございます!

+0

エンコーディング? –

+0

'streamReader.ReadToEnd()'の結果を表示します。 – leppie

+0

@ L.B - それを変更することは役に立ちません – AStupidNoob

答えて

5

Kだから私はそれを考え出しました、今はうまくいくようです。文字のコードは15 9E 02 00と15 9E 00 00だったので、1つのUTF-16 charで1つのコードを保持する方法はありません。したがって、代わりにUTF16は、これらのサロゲートペアを使用します。そこでは、1つの '要素'として機能する2つの異なる文字があります。

StringInfo.GetTextElementEnumerator(string fred); 

を、これはサロゲートペアの文字列を返します。要素を取得するには、我々が使用することができます。それを1文字として扱う。

こちらをご覧ください:

http://msdn.microsoft.com/en-us/library/system.globalization.stringinfo.aspx

http://msdn.microsoft.com/en-us/library/system.globalization.textelementenumerator.gettextelement.aspx

は、それが誰かの役に立てば幸い:出力ファイルのD

0

書き込み時には、UTF-32を指定していないので、デフォルトでEncoding.UTF8になります。 MSDNから

:そのGetPreamble方法が空バイト 配列を返すよう

このコンストラクタは、 バイトオーダーマーク(BOM)なしのUTF-8エンコーディングでのStreamWriterを作成します。 UTF-8エンコーディングとBOMを使用してStreamWriterを作成するには、 StreamWriter(String、Boolean、Encoding)のようなエンコーディングを指定するコンストラクタを使用することを検討してください。

+0

それは問題ではないようです。混乱を取り除くために質問を更新しました。とにかくおかげで! – AStupidNoob

0

StreamWriterにも同じエンコード(Encoding.UTF32)を指定する必要があると思います。

EDIT:

通常、それはUTFコードページ間で必要とされていませんが、私はまた、このしようとするだろう:私はこれを試してみました、それは私のPC上でうまく動作し

Encoding utf8 = Encoding.UTF8; 
Encoding utf32 = Enconding.UTF32; 
byte[] utf8Bytes = utf8.GetBytes(yourText); 
byte[] utf32Bytes = Encoding.Convert(utf8, utf32, utf8Bytes); 
string utf32Text = iso.GetString(utf32Text); 
+0

私は持っています:D、私はちょうど質問を編集しました。UTF-32文字はUTF-8やUnicodeエンコーディングで表現できるので、それは本当に重要ではありません。とにかく、AFAIK。 – AStupidNoob

+0

@AStupidNoob私は更新された回答とあなたのコメントを読んだだけです。読み込みファイルがエンコードされていることがわかっていて、それがUTF32以外の場合は、元のエンコードで読み込み、書き込む前に自分のエンコードに変換する必要があります。 – Dummy01

+0

もう一度お返事ありがとうございます。私はあなたの提案を試みたが、私はそれを働かせることができなかったD:。また、私はStringReadersとStringWritersの目的はすべてエンコーディング間の変換だと思っていました。そうでないかもしれない。 – AStupidNoob

1

を。

System.IO.StreamReader streamReader = new System.IO.StreamReader("input", true); 
System.IO.StreamWriter streamWriter = new System.IO.StreamWriter("output", false); 

streamWriter.Write(streamReader.ReadToEnd()); 

streamWriter.Close(); 
streamReader.Close(); 

たぶん、あなたがUTF32であると考えるテキストはないです。StreamReader's constructorためのMSDNの解説セクションから

+0

Visual Studio/Windowsを使用していますか?そうでなければ単なるモノであるかもしれません。私はそれが確かにUTF32であることを確かめるために他のプログラムを試してみるでしょう、それは確かに16進エディタのように見えます... – AStupidNoob

+0

よかった、幸運。しかし、あなたのコードは私のPC上で間違った出力を作り出しました。 –

+1

ああ、申し訳ありませんが、私はあなたのコードの変更に気付かなかった。他のニュースでは、Visual Studio 2012ベータ版を使用すると、私のコードで正しい結果が得られました... – AStupidNoob

0

このコンストラクタは、1024バイトに符号化 パラメータ、及び内部バッファサイズによって指定されるようにエンコーディングを初期化します。 StreamReaderオブジェクトは、ストリームの最初の3バイトの を見て、エンコードを検出しようとします。ファイルが適切なバイト順序マークで を開始する場合、UTF-8、 リトルエンディアンのUnicode、およびビッグエンディアンのUnicodeテキストを自動的に認識します。それ以外の場合は、ユーザー提供の エンコードが使用されます。さらに 情報については、Encoding.GetPreambleメソッドを参照してください。

ファイルの先頭にあるバイトオーダーマークは実際にはUTF 16(または何か)を示しているため、明示的に記載されているUTF 32エンコーディングは使用されていません。

+0

なぜ、私は正しいBOMを得るためにいくつかの他のプログラムを試してみませんか? – AStupidNoob

+0

@AStupidNoobブール型パラメータを追加してBOMを見ないコンストラクタのオーバーロードがあるように見えます。チェックする手元に別のプログラムがなければ、それを試すことができます。 – Tanzelax

+0

そうですね、私は、エンコーディングを指定すると、それが使用されていることが保証されていたはずです。私は、しかし、これを使用してWindowsを試して、それは働いた。しかし、UTF32でうまくいくWindowsプログラムがないので、UTF32出力を確認できませんでした。そのため、UTF8で出力するようにスワップしました。 – AStupidNoob