Encoding.GetEncoding(437).GetString()bug?

时间:2011-08-08 15:05:12

标签: c# .net .net-3.5 character-encoding

我有以下测试程序

char c = '§';
Debug.WriteLine("c: " + (int)c);

byte b = Encoding.GetEncoding(437).GetBytes("§")[0];
Debug.WriteLine("b: " + b);

char c1 = Encoding.GetEncoding(437).GetString(new byte[] { 21 })[0];
Debug.WriteLine("c1: " + (int)c1);

这会产生以下结果:

c: 167
b: 21
c1: 21

我可以看到here GetBytes工作正常 167 in unicode => CP437中的21 但GetString不工作
CP437中的21 => 21在unicode

这是一个错误还是我的错误?

2 个答案:

答案 0 :(得分:7)

对于0-31范围内的字符,CP437不是“双向”。如您在维基百科页面中所述:

  

对于许多用途,代码范围为0到31,代码为127   不产生这些符号。其中一些(或全部)将被解释   作为ASCII控制字符。

将Unicode字符映射到此范围内支持的CP437字符有效,但不是相反。例如,取字符13和10表示的字符:如果你在CP437字符串中输入它们,你实际上希望保留回车符和换行符,而不是转换为子弹和音符。这种行为是正常的:这不是一个错误。

答案 1 :(得分:0)

.net支持两个不同的字符,两者都(通常)呈现为§

char c1 = (char)21;
char c2 = (char)167;

Console.WriteLine(c1 == c2);  // prints false
Console.WriteLine(c1);        // prints §
Console.WriteLine(c2);        // prints §

字符21是一个特殊的控制字符,在文本模式下输出时呈现为§

CP437允许将21解释为控制字符或文字§。显然,GetString选择将其解释为控制字符(这是一个完全有效的选项),因此,将其映射到Unicode控制字符21而不是Unicode文字§