23

例如:“½”或 ASCII DEC 189。当我从文本文件中读取字节时,byte[] 包含有效值,在本例中为 189。

转换为 Unicode 会导致 Unicode 替换字符 65533。

UnicodeEncoding.Unicode.GetString(b);

转换为 ASCII 结果为 63 或“?”

ASCIIEncoding.ASCII.GetString(b);

如果这是不可能的,那么处理这些数据的最佳方法是什么?我希望能够执行像 Replace() 这样的字符串函数。

4

4 回答 4

29

字节 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),但最好始终指定。

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

于 2009-03-20T14:50:07.250 回答
14

旧的 PC-8 或扩展 ASCII 字符集在 IBM 和 Microsoft 将 Code Pages 的概念引入 PC 世界之前就已经存在。这是 1982 年的扩展 ASCII。事实上,它是当时 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);
    }
于 2012-02-28T22:59:39.687 回答
13

这取决于编码是什么。

没有“ASCII 189”之类的东西 - ASCII 只能达到 127。有许多编码,其中 8 位编码使用 ASCII 作为前 128 个值。

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

于 2009-03-20T14:32:19.617 回答
1

System.String[]如果您尝试处理任何扩展的 ASCII 字符,则无法存储字符,ASCII > 127 例如œ ¢ ½ ¾这里是将其转换为二进制和十进制等价物的方法

于 2014-07-18T14:41:40.040 回答