我有以下测试程序
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
这是一个错误还是我的错误?
答案 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文字§
。