4

我正在从另一个系统检索使用代码页 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 字符串。

所以我的问题是,是否有任何内置方法可以正确进行此转换,或者我的解决方法是正确的方法?

4

3 回答 3

4
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);
于 2012-08-14T12:44:56.417 回答
4

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

string s = "ö";

这是带有分音符号的拉丁小写字母 O,又名代码点 00F6。

所以:

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

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

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

我们发现它是一个单字节十进制 148,也就是十六进制 94 - 即你所追求的。

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

于 2012-08-14T12:52:13.750 回答
2

您必须更早地查看代码。一旦您将数据作为字符串,它就已经被解码。在该解码中丢失的任何字符都无法找回。

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

byte[] asciiData = new byte[] { 0x94 }; // character ö in codepage 437

Encoding asciiEncoding = Encoding.GetEncoding(437);

string unicodeString = asciiEncoding.GetString(asciiData);

Console.WriteLine(unicodeString);

输出:

ö
于 2012-08-14T12:48:59.530 回答