8

そのため、文字エンコーディングに問題があります。次の 2 文字を UTF32 でエンコードされたテキスト ファイルに入れると、次のようになります。

そして、それらに対して次のコードを実行します。

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();

私は得る:

鸕
鸕

(同じ文字が 2 回、つまり入力ファイル != 出力)

最初の文字の 16 進数:

15 9E 02 00

そして2番目に:

15 9E 00 00

テキスト ファイルの作成には gedit を使用し、C# には mono を使用し、Ubuntu を使用しています。

入力ファイルまたは出力ファイルのエンコーディングを指定するかどうかも問題ではありません。UTF32 エンコーディングの場合は気に入らないだけです。入力ファイルが UTF-8 エンコーディングの場合に機能します。

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

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

それはバグですか、それとも私だけですか?

ありがとう!

4

5 に答える 5

6

K、それで私はそれを理解したと思います、それは今うまくいくようです. 文字のコードは 15 9E 02 00 と 15 9E 00 00 だったので、それらを 1 つの単一の UTF-16 で保持する方法はありませんchar。そのため、代わりに 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

于 2012-04-09T02:03:43.297 に答える
1

私はこれを試しましたが、私のPCではうまく動作します。

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 であると思われるテキストはそうではありません

于 2012-04-03T07:11:49.043 に答える
0

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

編集:

通常、UTF コードページ間では必要ありませんが、これも試してみます。

Encoding utf8 = Encoding.UTF8;
Encoding utf32 = Encoding.UTF32;
byte[] utf8Bytes = utf8.GetBytes(yourText);
byte[] utf32Bytes = Encoding.Convert(utf8, utf32, utf8Bytes);
string utf32Text = utf32.GetString(utf32Bytes);
于 2012-04-03T06:06:10.377 に答える
0

StreamReader のコンストラクターのMSDN の備考セクションから:

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

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

于 2012-04-03T07:16:19.640 に答える
0

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

MSDNから:

このコンストラクターは、バイト オーダー マーク (BOM) のない UTF-8 エンコードで StreamWriter を作成するため、その GetPreamble メソッドは空のバイト配列を返します。UTF-8 エンコーディングと BOM を使用して StreamWriter を作成するには、StreamWriter(String, Boolean, Encoding) などのエンコーディングを指定するコンストラクターの使用を検討してください。

于 2012-04-03T06:01:55.170 に答える