【发布时间】:2016-02-02 01:54:24
【问题描述】:
我目前正在尝试让自己了解不同的编码类型。我尝试制作一个简单的控制台应用程序来告诉我类型之间的区别。
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 表,但显然没有一种可以......
一点上下文:
我正在尝试确定哪种编码最适合我们公司的标准,我个人认为 UTF8 可以,但我的主管希望在我们决定之前先看看一些示例。
显然我们知道我们需要时不时地使用其他编码类型(例如串行通信使用 7 位,因此我们不能在那里使用 UTF8),但通常我们希望坚持使用一种编码类型。目前我们随机使用默认、ASCII 和 UTF8,所以这不是一件好事。
编辑
输出根据:
Console.WriteLine("Default: {0} for {1}", s, Console.OutputEncoding.CodePage);
编辑 2:
因为我认为可能没有一种编码,其中扩展的 ascii 字符对应于我链接到的表中的十进制数字,所以我把它转过来了:
char specialChar = '√';
int charNumber = (int)specialChar;
给我数字:8730,在表格中是 251
【问题讨论】:
-
你的控制台的代码页是什么?查看“属性”对话框。请注意,没有一种称为“扩展 ASCII”的编码 - 有许多 不同 8 位编码共享前 128 个值的 ASCII。 (是的,UTF-8 几乎可以肯定是标准化的最佳选择。)
-
顺便说一句,您应该在这里分离两个问题:a)您可以在控制台上打印哪些字符; b)您的字符串中有哪些字符。您可以确定后者没有前者...有关示例代码,请参阅csharpindepth.com/Articles/General/Strings.aspx。
-
@JonSkeet 好问题,我认为
Console.OutputEncoding = Encoding.ASCII;会给我正确的代码页。 -
不,这会改变您将字节转换为字符串的方式 - 它不会影响控制台能够显示的内容。
-
您单击左上角,然后选择“属性”——这就是我说要查看“属性”对话框的原因。另见stackoverflow.com/questions/388490
标签: c# utf-8 character-encoding ascii