例如:“½”或ASCII DEC 189.当我从文本文件中读取字节时,byte []包含有效值,在本例中为189。
转换为Unicode会产生Unicode替换字符65533.
UnicodeEncoding.Unicode.GetString(B);
转换为ASCII会导致63或“?”
ASCIIEncoding.ASCII.GetString(B);
如果不可能,处理这些数据的最佳方法是什么?我希望能够执行像Replace()这样的字符串函数。
答案 0 :(得分:25)
字节189表示iso-8859-1(又名“Latin-1”)中的“½”,因此以下可能是您想要的:
var e = Encoding.GetEncoding("iso-8859-1");
var s = e.GetString(new byte[] { 189 });
.NET中的所有字符串和字符都是UTF-16编码的,因此您需要使用编码器/解码器来转换其他任何内容,有时这是默认的(例如,对于FileStream实例使用UTF-8),但良好的做法是始终指定
您需要某种形式的隐式或(更好)显式元数据来为您提供有关哪种编码的信息。
答案 1 :(得分:12)
这取决于编码的确切含义。
没有“ASCII 189”这样的东西 - ASCII只能达到127.有许多编码使用ASCII作为前128个值的8位编码。
你可能想要Encoding.Default
(这是您特定系统的默认编码),但很难确定。您的数据来自哪里?
答案 2 :(得分:12)
旧的PC-8或扩展的ASCII字符集在IBM和微软向PC世界引入代码页的想法之前就已存在。这是WAS扩展ASCII - 在1982年。实际上,它是当时PC上唯一可用的字符集,直到EGA卡允许您将其他字体加载到VRAM中。
这也是ANSI终端的默认标准,几乎我在80年代和90年代早期拨打的所有BBS都使用这个字符集来显示菜单和框。
以下是将8位扩展ASCII转换为Unicode文本的代码。注意代码的关键位:GetEncoding(“437”)。使用Code Page 437将8位ASCII文本转换为Unicode等效文本。
string ASCII8ToString(byte[] ASCIIData)
{
var e = Encoding.GetEncoding("437");
return e.GetString(ASCIIData);
}
答案 3 :(得分:1)
System.String[]
无法使用ASCII > 127
存储字符
如果您正在尝试处理任何扩展的ASCII字符,例如œ ¢ ½ ¾
here,则将其转换为二进制和十进制等效值的方法