为什么控制台不打印我期望的字符
Why is the console not printing the characters i am expecting
我目前正在尝试自学不同的编码类型。我试图制作一个简单的控制台应用程序来告诉我类型之间的区别。
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: }~���������
嗯...从控制台输出到这里的字符也不能很好地复制,所以这是一个打印屏幕。
我所期望的是看到扩展的 ASCII 字符。默认编码几乎是正确的,但它无法显示 251, 252 and 253
但这可能是 Console.writeLine() 的一个缺点,尽管我不希望如此。
调试时变量的表示如下:
Default encoded string = "}~€‚úûüýþÿ"
ASCII encoded string = "}~?????????"
UTF8 encoded string = "}~���������"
有人可以告诉我我做错了什么吗?我希望其中一种编码类型能够正确显示扩展的 ASCII table 但显然 none 可以...
一些上下文:
我正在尝试确定哪种编码最适合我们公司的标准,我个人认为 UTF8 可以,但我的主管希望在我们决定之前先看一些示例。
显然我们知道我们时不时需要使用其他编码类型(例如,串行通信使用 7 位,因此我们不能在那里使用 UTF8)但通常我们希望坚持使用一种编码类型.目前我们随机使用默认值、ASCII 和 UTF8,所以这不是一件好事。
编辑
输出依据:
Console.WriteLine("Default: {0} for {1}", s, Console.OutputEncoding.CodePage);
编辑 2:
因为我认为可能没有扩展的 ascii 字符对应于我链接到的 table 中的十进制数字的编码,所以我把它转过来,这个:
char specialChar = '√';
int charNumber = (int)specialChar;
给我号码:8730 在 table 中是 251
奇怪,有这段代码
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" 并检查输出。
您的案例中的输出编码应该几乎无关紧要,因为您甚至没有使用 Unicode。此外,您需要将控制台 window 设置从 Raster 字体更改为 TrueType 字体,例如 Lucida Console 或 Consolas。当控制台设置为光栅字体时,您可以仅使用 OEM 编码(在您的情况下为 CP850),这意味着 Unicode 根本不起作用。
但是,所有这些都没有实际意义,因为您的代码充其量是……奇怪。首先,关于这里发生的事情:你有一个字节数组,用各种编码解释它并得到一个 (Unicode) 字符串。将该字符串写入控制台时,Unicode 字符将转换为控制台代码页中最接近的等效字符(此处为 850)。如果没有等价物,甚至不接近,那么你会得到一个问号 ?
。这种情况在 ASCII 和 127 以上的字符中最为明显,因为它们根本不存在于 ASCII 中。
如果您想要看到您想要的字符,那么要么始终使用正确的编码,而不是试图干预直到它有点工作,要么只使用正确的字符开始。
Console.WriteLine("√ⁿ²")
实际上应该可以工作,因为它贯穿了上述编码翻译过程。
我目前正在尝试自学不同的编码类型。我试图制作一个简单的控制台应用程序来告诉我类型之间的区别。
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: }~���������
嗯...从控制台输出到这里的字符也不能很好地复制,所以这是一个打印屏幕。
我所期望的是看到扩展的 ASCII 字符。默认编码几乎是正确的,但它无法显示 251, 252 and 253
但这可能是 Console.writeLine() 的一个缺点,尽管我不希望如此。
调试时变量的表示如下:
Default encoded string = "}~€‚úûüýþÿ"
ASCII encoded string = "}~?????????"
UTF8 encoded string = "}~���������"
有人可以告诉我我做错了什么吗?我希望其中一种编码类型能够正确显示扩展的 ASCII table 但显然 none 可以...
一些上下文:
我正在尝试确定哪种编码最适合我们公司的标准,我个人认为 UTF8 可以,但我的主管希望在我们决定之前先看一些示例。
显然我们知道我们时不时需要使用其他编码类型(例如,串行通信使用 7 位,因此我们不能在那里使用 UTF8)但通常我们希望坚持使用一种编码类型.目前我们随机使用默认值、ASCII 和 UTF8,所以这不是一件好事。
编辑
输出依据:
Console.WriteLine("Default: {0} for {1}", s, Console.OutputEncoding.CodePage);
编辑 2:
因为我认为可能没有扩展的 ascii 字符对应于我链接到的 table 中的十进制数字的编码,所以我把它转过来,这个:
char specialChar = '√';
int charNumber = (int)specialChar;
给我号码:8730 在 table 中是 251
奇怪,有这段代码
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" 并检查输出。
您的案例中的输出编码应该几乎无关紧要,因为您甚至没有使用 Unicode。此外,您需要将控制台 window 设置从 Raster 字体更改为 TrueType 字体,例如 Lucida Console 或 Consolas。当控制台设置为光栅字体时,您可以仅使用 OEM 编码(在您的情况下为 CP850),这意味着 Unicode 根本不起作用。
但是,所有这些都没有实际意义,因为您的代码充其量是……奇怪。首先,关于这里发生的事情:你有一个字节数组,用各种编码解释它并得到一个 (Unicode) 字符串。将该字符串写入控制台时,Unicode 字符将转换为控制台代码页中最接近的等效字符(此处为 850)。如果没有等价物,甚至不接近,那么你会得到一个问号 ?
。这种情况在 ASCII 和 127 以上的字符中最为明显,因为它们根本不存在于 ASCII 中。
如果您想要看到您想要的字符,那么要么始终使用正确的编码,而不是试图干预直到它有点工作,要么只使用正确的字符开始。
Console.WriteLine("√ⁿ²")
实际上应该可以工作,因为它贯穿了上述编码翻译过程。