1

コンソールとデバッグで出力が異なるのはなぜですか?

byte [] data = new byte [] {0xB1, 0x00,0xA6,0x7C, 0x4e, 0xEC, 0xE7, 0xFF, 0xDD, 0xCE};

Console.WriteLine (new String(Encoding.GetEncoding("ISO-8859-1").GetChars(data)));
Console.WriteLine (Encoding.UTF8.GetString(data));

Debug.WriteLine (new String(Encoding.GetEncoding("ISO-8859-1").GetChars(data)));
Debug.WriteLine (new String(Encoding.UTF8.GetChars(data)));

"Console.WriteLine" (Latin1 エンコーディング) 出力 -> ±¦|NìçÿÝÎ

"Console.WriteLine" (UTF8) 出力 -> ��|N�����</p>

「Debug.WriteLine」は出力を示しません。

4

3 に答える 3

1

これはほとんどガベージ イン ガベージ アウトです。

� 文字はUnicode 置換文字、コード U+FFFD です。バイト値には適切な utf-8 エンコーディング値が含まれていないため、多くの値が取得されます。

Debug.Print() ステートメント、少なくとも私のマシンでは出力を生成します。出力ウィンドウを見てください。デバッグ出力の既定のリスナーは、Windows の OutputDebugString() API 関数を呼び出す関数であるため、文字列の最初の文字だけが表示されます。出力をデバッガーに送信します。これは C 言語ベースの API 関数です。0 は文字列ターミネータであるため、1 文字しか出力されません。

何をしようとしても、バイト値がテキストを表していないことは明らかです。バイナリデータが何であるかを推測するためのパターンは見当たりません。

于 2012-08-15T05:44:06.333 に答える
0

配列の 2 番目の位置にa0x00があります。これは、ご存じのとおり、文字列の末尾です。Debug.WriteLineASCIIエンコーディングで出力します。したがって、出力ウィンドウの最初のバイトのみを出力します。

に変更0x00する0x01と、完全な出力が表示されます。

詳細[ウォッチ] ウィンドウを見るnew String(Encoding.GetEncoding("ISO-8859-1").GetChars(data))と、例外がスローされていることがわかります。

'new String(Encoding.GetEncoding("ISO-8859-1").GetChars(data))' threw an exception of type 'System.ArgumentException' string {System.ArgumentException}

これは通常、存在しない配列要素にアクセスしようとしたときに発生します。

于 2012-08-15T04:32:14.500 に答える
0

これは、互換性の理由からデフォルトで ASCII であるOutputDebugStringを呼び出すためです。頭のてっぺんからの回避策はわかりませんが、探してみます。

編集

実際には、問題を再現できません。私のマシンでは、次の出力が得られます。

±□¦|NìçÿÝÎ

�□�|N�����</p>

±□¦|NìçÿÝÎ

�□�|N�����</p>

于 2012-08-15T04:33:16.480 に答える