如何将字符代码大于127的字符串正确转换为字节数组?

我正在从另一个系统检索用代码页437编码的ASCII字符串,我需要将其转换为Unicode,以便它们可以与其他Unicode字符串混合使用。

这就是我正在使用的:

var asciiString = "\u0094"; // 94 corresponds represents 'ö' in code page 437. var asciiEncoding = Encoding.GetEncoding(437); var unicodeEncoding = Encoding.Unicode; // This is what I attempted to do but it seems not to be able to support the eight bit. Characters using the eight bit are replaced with '?' (0x3F) var asciiBytes = asciiEncoding.GetBytes(asciiString); // This work-around does the job, but there must be built in functionality to do this? //var asciiBytes = asciiString.Select(c => (byte)c).ToArray(); // This piece of code happliy converts the character correctly to unicode { 0x94 } => { 0xF6, 0x0 } . var unicodeBytes = Encoding.Convert(asciiEncoding, unicodeEncoding, asciiBytes); var unicodeString = unicodeEncoding.GetString(unicodeBytes); // I want this to be 'ö'. 

我正在努力的是,我在.NET框架中找不到合适的方法来将字符代码大于127的字符串转换为字节数组。 这看起来很奇怪,因为有支持将字符数超过127的字节数组转换为Unicode字符串。

所以我的问题是,有没有内置的方法来正确地进行这种转换,还是我的工作方式正确的方法呢?

 var asciiString = "\u0094"; 

无论你怎么命名,它都将是一个Unicode字符串。 .NET只有Unicode字符串。

我正在从另一个系统检索用代码页437编码的ASCII字符串

将传入数据视为byte[] ,而不是string

 var asciiBytes = new byte[] { 0x94 }; // 94 corresponds represents 'ö' in code page 437. var asciiEncoding = Encoding.GetEncoding(437); var unicodeString = asciiEncoding.GetString(asciiBytes); 

\u0094Unicode代码点 0094,它是一个控制字符 ; 它不是 ö 。 如果你想要ö ,那么正确的字符串是

 string s = "ö"; 

这是带有DIAERESIS的LATIN SMALL LETTER O,又名代码00F6。

所以:

 var s = "\u00F6"; // Identical to "ö" 

现在我们得到我们的编码:

 var enc = Encoding.GetEncoding(437); var bytes = enc.GetBytes(s); 

我们发现它是一个单字节小数148,它是hex94 – 即你所追求的。

这里的意义在于,在C#中使用"\uXXXX"语法时,XXXX 始终是指Unicode代码点, 而不是某些特定编码中的编码值。

你必须先在代码中查看。 将数据作为字符串后,它已经被解码。 在解码中丢失的任何字符都无法返回。

您需要输入作为字节,以便您可以使用编码对象进行代码页437将其解码为字符串。

 byte[] asciiData = new byte[] { 0x94 }; // character ö in codepage 437 Encoding asciiEncoding = Encoding.GetEncoding(437); string unicodeString = asciiEncoding.GetString(asciiData); Console.WriteLine(unicodeString); 

输出:

 ö 

你可以试试

 public Form1() { InitializeComponent(); this.SerialPort.Encoding = Encoding.GetEncoding(28591); }