0

我有一个字符数组,其中一些是十进制的 ASCII 128 和 130。我试图将它们作为普通字符读取,但我得到的不是 128,而是 8218 作为 int(转换为字节,得到 26)。我需要得到 128 到 130 之间的数字。我发现了一些关于 Encodings 的文章,有人说我需要使用 Encoding 439。

有任何想法吗?

4

1 回答 1

2

CLR 环境中的 char (System.Char) 是一个无符号的 16 位数字,一个 UTF-16代码单元。来自Unicode 标准,第 3 章,第 3.9 节

代码单元:可以表示用于处理或交换的编码文本单元的最小位组合。

  • 代码单元是计算机存储的特定单元。其他字符编码标准通常使用定义为 8 位单元的代码单元,即八位字节。Unicode 标准使用 UTF-8 编码形式的 8 位代码单元、UTF-16 编码形式的 16 位代码单元和 UTF-32 编码形式的 32 位代码单元。

  • 码元在信息产业中也称为码值。

  • 在 Unicode 标准中,某些代码单元的特定值不能单独用于表示一个编码字符。此限制适用于 UTF-16 中的独立代理代码单元和 UTF-8 中的字节 80–FF。类似的限制适用于其他字符编码标准的实现;例如,SJIS (Shift-JIS) 中的字节 81–9F、E0–FC 本身不能表示编码字符。

一旦进入 CLR 世界,您的“ASCII”文本就不再是 ASCII。ASCII 是一种 7 位编码,为了兼容性,所有 Unicode 编码(UTF-8、-16、-24、-32)都保留了代码点 0x00–0x7F。在非 Unicode 世界中,0x80–0xFF 总是有多个字符映射(甚至不看 EBCDICASCII)。还为奇偶校验提供了一些 ASCII 实现:将设置高位以保持所需的奇偶校验。

  • 甚至平价。设置高位以在八位字节中保持偶数个“on”位。
  • 奇偶校验。设置高位以在八位字节中保持奇数个“on”位。
  • 没有平价。永远不会设置高位。

大概您正在使用 UTF-8 编码器/解码器(CLR 默认值)读取“ASCII”文本。要在字符中获得您期望的数值,您需要使用适合您的文本实际编码的编码/解码器来读取文本(Windows 1252?其他?)。

也许对您来说更好的方法是将八位字节的文本读取为二进制,使用System.IO.FileStream, 而不是System.IO.TextReader及其奴才。然后你得到了原始八位字节,你可以根据需要将它们转换为文本,或者对原始八位字节值进行数学运算。

于 2012-07-26T22:44:21.427 回答