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 是一个字符串终止符,所以它只会打印一个字符。

无论您要做什么,很明显字节值不代表文本。我没有看到任何模式来猜测二进制数据可能是什么。

于 2012-08-15T05:44:06.333 回答
0

你有一个0x00在数组的第二个位置,如你所知,它是一个字符串结尾。Debug.WriteLine以 ASCII 编码输出。因此,它只输出输出窗口中的第一个字节。

如果您更改0x00为,0x01您将看到完整的输出。

更多当我new String(Encoding.GetEncoding("ISO-8859-1").GetChars(data))在 Watch 窗口中查看时,我看到一个异常被抛出:

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

这通常发生在尝试访问不存在的 Array 元素时。

于 2012-08-15T04:32:14.500 回答
0

因为它调用OutputDebugString,出于兼容性原因,默认情况下它是 ASCII。我不知道有什么解决方法,但我会寻找一个。

编辑

实际上,我无法重现您的问题。在我的机器上,我得到这个输出:

±□¦|NìçÿÝÎ

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

±□¦|NìçÿÝÎ

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

于 2012-08-15T04:33:16.480 回答