为什么控制台无法打印我期待的字符

时间:2015-11-02 08:17:07

标签: c# utf-8 character-encoding ascii

我目前正在努力教育自己关于不同编码类型的知识。我尝试制作一个简单的控制台应用程序来告诉我类型之间的区别。

byte[] byteArray = new byte[] { 125, 126, 127, 128, 129, 130, 250, 254, 255 };
string s = Encoding.Default.GetString(byteArray);
Console.OutputEncoding = Encoding.Default;
Console.WriteLine("Default: " + s);

s = Encoding.ASCII.GetString(byteArray);
Console.OutputEncoding = Encoding.ASCII;
Console.WriteLine("ASCII: " + s);

s = Encoding.UTF8.GetString(byteArray);
Console.OutputEncoding = Encoding.UTF8;
Console.WriteLine("UTF8: " + s);

然而输出与我预期的完全不同。

Default: }~€‚úûüýþÿ
ASCII: }~?????????
UTF8: }~���������

嗯......角色不能很好地从控制台输出复制到这里,所以这里是一个打印屏幕。

Console output printscreen

我所期望的是看到扩展的ASCII字符。默认编码几乎是正确的,但它不能显示251, 252 and 253,但这可能是Console.writeLine()的一个缺点,尽管我不希望这样。

enter image description here

调试时变量的表示如下:

Default encoded string = "}~€‚úûüýþÿ"
ASCII encoded string = "}~?????????"
UTF8 encoded string = "}~���������"

有人可以告诉我我做错了什么吗?我希望其中一种编码类型可以正确显示扩展的ASCII表,但显然没有...

一点背景:
我正在尝试确定编码最适合我们公司的标准,我个人认为UTF8会做,但我的主管希望在我们决定之前看到一些例子。

显然我们知道我们需要时不时地使用其他编码类型(例如串行通信使用7位,因此我们不能在那里使用UTF8)但是通常我们希望坚持使用一种编码类型。目前我们随机使用默认,ASCII和UTF8,这不是一件好事。

修改
输出根据:

Console.WriteLine("Default: {0} for {1}", s, Console.OutputEncoding.CodePage);

output with code page

编辑2:
因为我认为可能没有一个编码,其中扩展的ascii字符对应于我链接到的表格中的十进制数字我转过身来:

char specialChar = '√';
int charNumber = (int)specialChar;

给我的数字:8730,表中的数字为251

2 个答案:

答案 0 :(得分:2)

您的情况下的输出编码应该是无关紧要的,因为您甚至不使用Unicode。此外,您需要将控制台窗口设置从Raster字体更改为TrueType字体,如Lucida Console或Consolas。当控制台设置为光栅字体时,您只能 具有OEM编码(在您的情况下为CP850),这意味着Unicode根本不起作用。

然而,所有这一切都没有实际意义,因为你的代码是...奇怪,充其量。首先,关于这里发生了什么:你有一个字节数组,在各种编码中解释它并获得一个(Unicode)字符串。将该字符串写入控制台时,Unicode字符将转换为控制台代码页中最接近的等效字符(此处为850)。如果没有相应的,甚至没有关闭,那么你会得到一个问号?。这种情况最突出的是ASCII和127以上的字符,因为它们根本不存在于ASCII中。

如果你想要看到你想要的字符,那么要么在整个过程中使用正确的编码,而不是试图插入它,直到它有点起作用,或者只是使用正确的字符开始。

Console.WriteLine("√ⁿ²")

实际应该有效,因为它贯穿上述编码转换过程。

答案 1 :(得分:0)

奇怪,使用此代码

Console.OutputEncoding = Encoding.Default;
Console.WriteLine("Default: {0} for {1}", s, Console.OutputEncoding.HeaderName);
s = Encoding.ASCII.GetString(byteArray);
Console.OutputEncoding = Encoding.ASCII;
Console.WriteLine("ASCII: {0} for {1}", s, Console.OutputEncoding.HeaderName);
s = Encoding.UTF8.GetString(byteArray);
Console.OutputEncoding = Encoding.UTF8;
Console.WriteLine("UTF8: {0} for {1}", s, Console.OutputEncoding.HeaderName);

我得到了这个:

Default: }~€‚úþÿ for Windows-1252
ASCII: }~?????? for us-ascii
UTF8: }~ ������ for utf-8

这是我所期待的。默认代码页是CP1252,而不是表中显示的CP850。 为您的控制台尝试其他默认字体,例如“Consolas”或“Lucidia Console”并检查输出。