如何将扩展ASCII转换为System.String?

23
例如:"½" 或 ASCII DEC 189。当我从文本文件读取字节时,byte[]包含有效值,在这种情况下是189。
转换为Unicode会导致Unicode替换字符65533。
UnicodeEncoding.Unicode.GetString(b);
转换为ASCII结果为63或"?"。
ASCIIEncoding.ASCII.GetString(b);
如果不能将其转换,那么处理这些数据的最佳方式是什么?我想能够执行类似于Replace()的字符串函数。
4个回答

30

在 iso-8859-1 (也称为 "Latin-1") 中,字节 189 表示 "½",因此可能以下是你想要的:

var e = Encoding.GetEncoding("iso-8859-1");
var s = e.GetString(new byte[] { 189 });

.NET中的所有字符串和字符都是UTF-16编码的,因此您需要使用编码器/解码器来转换任何其他格式,有时这是默认的(例如FileStream实例的UTF-8),但最好的做法是始终指定。

您需要某种形式的隐式或(更好的)显式元数据来提供有关编码的信息。


1
这个编码问题一直让我发疯...但是你的答案解决了我的问题!!! 我花了一些时间才弄清楚该搜索什么,但最终我找到了正确的搜索词。 :) 谢谢你为我的问题提供了一个简单的解决方案。 :) - Dave
但是我们不能在每次读取时添加此代码,应该有其他更好的方法来解决这个问题。 - RJN
@Rajan365:你所说的“every read”是什么意思?(而且你应该提出一个新问题。) - Richard
@Richard 我的意思是,我是否可以使用Encoding.Default代替明确指定"iso-8859-1"之类的代码页,这样会得到相同的代码页吗? - RJN
1
@Rajan365 如果默认编码始终正确,那当然可以。但是如果用户的语言环境发生了变化,那么默认编码也可能会随之改变。此外,您当然可以保留“编码”实例,而不需要为每个字符串获取新实例。 - Richard

14

在IBM和微软将代码页引入PC世界之前,旧的PC-8或扩展ASCII字符集已经存在了。这是1982年的扩展ASCII字符集,实际上也是当时PC上唯一可用的字符集,直到EGA卡允许您将其他字体加载到VRAM中。

这也是ANSI终端的默认标准,我拨打的几乎每个BBS都使用该字符集来显示菜单和框。

以下是将8位扩展ASCII转换为Unicode文本的代码。请注意关键代码:GetEncoding("437")。它使用代码页437将8位ASCII文本转换为Unicode等效文本。

    string ASCII8ToString(byte[] ASCIIData)
    {
        var e = Encoding.GetEncoding("437");
        return e.GetString(ASCIIData);
    }

哇!谢谢你!顺便说一下,你的答案也是将字节数组转换为字符串和反向转换的一个非常好的解决方案。 - mike

13

这取决于编码的具体内容。

"ASCII 189"并不存在 - ASCII只包括从0到127的值。有许多编码使用ASCII作为前128个值的8位编码。

可能需要Encoding.Default(这是您特定系统的默认编码),但很难确定。您的数据来自哪里?


我读入的byte[]与扩展ASCII表中的188-190相符:http://charlie.balch.org/asp/ascii.asp。Encoding.Default解决了问题。非常感谢! - rtremaine
2
很高兴它起作用了 - 只要注意,任何人谈论“扩展ASCII”似乎意味着一个特定的编码方式,那么他们就不知道自己在说什么。这就像谈论“一美元” - 一美元、一澳大利亚元、一加拿大元,哪个?在特定的情况下可能有意义。 - Jon Skeet
1
但这并不是一个明确和独特的想法。所以我敢说,查理的“扩展ASCII”的想法适合他的文化 - 但它不会匹配其他人电脑上发生的情况。 - Jon Skeet

1

System.String[] 无法存储ASCII码大于127的字符。如果您正在处理任何扩展ASCII字符,比如œ ¢ ½ ¾这里是将它们转换为二进制和十进制的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接