如何从代码页437转换字符?

时间:2019-09-17 14:29:32

标签: c# .net encoding character-encoding

我正在尝试转换以code page 437编码的文本:

☺☻♥♦♣♠•◘○♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼

这些都是真实,有效的Unicode字符-您可以在C#字符串中很好地表示它们:

String original = "☺☻♥♦♣♠•◘○♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼";
Console.WriteLine("Original: "+original);

>Original: ☺☻♥♦♣♠•◘○♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼

如果您获得了它们对应的unicode代码点,就会发现它们确实都是有效的unicode字符:

Console.WriteLine("Original code points: "+StringToCodePoints(original));

>Original code points:  U+263A U+263B U+2665 U+2666 U+2663 U+2660 U+2022 U+25D8 U+25CB U+2642 U+2640 U+266A U+266B U+263C U+25BA U+25C4 U+2195 U+203C U+00B6 U+00A7 U+25AC U+21A8 U+2191 U+2193 U+2192 U+2190 U+221F U+2194 U+25B2 U+25BC

编码到代码页437

如果C#将它们转换为代码页437,则会得到一个预期字节数组:

Encoding enc = Encoding.GetEncoding(437);
Byte[] data = enc.GetBytes(original);
Console.WriteLine("CP 437: "+BitConverter.ToString(data));

>CP 437: 01-02-03-04-05-06-07-08-09-0B-0C-0D-0E-0F-10-11-12-13-14-15-16-17-18-19-1A-1B-1C-1D-1E-1F

这正是我所期望的;我正在测试437代码页的前30个字符:

enter image description here

从代码页437转换回

现在,我尝试将CP437编码的字节转换回字符,然后我得到无意义的垃圾:

String actual = enc.GetString(data);
Console.WriteLine("Actual: "+actual);

>Actual:          

然后查看字符串中的实际字符,我得到:

Console.WriteLine("Actual code points: "+StringToCodePoints(actual));

>Actual code points:  U+0001 U+0002 U+0003 U+0004 U+0005 U+0006 U+0007 U+0008 U+0009 U+000B U+000C U+000D U+000E U+000F U+0010 U+0011 U+0012 U+0013 U+0014 U+0015 U+0016 U+0017 U+0018 U+0019 U+001A U+001B U+001C U+001D U+001E U+001F

所以.NET所做的一切完全错误。

我如何使其正确执行?

CS Fiddle

0 个答案:

没有答案