我有一个字符数组,其中一些是ASCII 128和十进制的130。我试图将它们作为普通字符读取,但不是128,而是将8218作为int(转换为字节,得到26)。我需要在128到130之间得到这个数字。我发现了一些关于编码的文章,有些人说我需要使用编码439。
有什么想法吗?
答案 0 :(得分:2)
CLR环境中的char(System.Char)是无符号的16位数字,UTF-16 code unit。来自Unicode Standard, Chapter 3, §3.9:
代码单元:可以代表a的最小位组合 用于处理或交换的编码文本单位。
代码单位是计算机存储的特定单位。其他字符编码 标准通常使用定义为8位单元的代码单元,即八位字节。该 Unicode标准使用UTF-8编码格式的16位代码单元,16位代码 UTF-16编码格式的单位,以及UTF-32编码格式的32位代码单元。
代码单位在信息行业中也称为代码值。
在Unicode标准中,某些代码单元的特定值不能用于 代表隔离的编码字符。此限制适用于隔离 UTF-16中的代理代码单元和UTF-8中的字节80-FF。类似 限制适用于其他字符编码标准的实现; 例如,SJIS(Shift-JIS)中的字节81-9F,E0-FC不能表示编码 他们自己的角色。
您的“ASCII”文本在CLR世界中不再是ASCII。 ASCII是一种7位编码,为了兼容性,所有Unicode编码(UTF-8,-16,-24,-32)都保持代码点0x00-0x7F。在非Unicode世界中,0x80-0xFF始终具有多个字符映射(甚至不查看EBCDIC vs ASCII)。一些ASCII实现也提供了奇偶校验:高阶位将被设置为保持所需的奇偶校验。
据推测,您正在使用UTF-8编码器/解码器(CLR默认值)读取“ASCII”文本。要获得您在字符中所需的数值,您需要使用适合您的文本实际编码的编码/解码器来阅读文本(Windows 1252?还有什么?)。
对您而言,更好的方法可能是使用System.IO.FileStream
而不是System.IO.TextReader
及其爪子,将八位字节的文本八位字节读取为二进制。然后你就有了原始的八位字节,你可以根据需要将它们转换成文本,或者对原始八位字节值进行数学运算。