如何读取ASCII值在128-130范围内并将其转换为int值的char

时间:2012-07-26 22:08:25

标签: c# .net encoding ascii extended-ascii

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

有什么想法吗?

1 个答案:

答案 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实现也提供了奇偶校验:高阶位将被设置为保持所需的奇偶校验。

  • 偶校验。高位设置为在八位位组中保持偶数个'on'位。
  • 奇数奇偶校验。高位设置为在八位位组中保持奇数个“开”位。
  • 无奇偶校验。高位位永远不会设置。

据推测,您正在使用UTF-8编码器/解码器(CLR默认值)读取“ASCII”文本。要获得您在字符中所需的数值,您需要使用适合您的文本实际编码的编码/解码器来阅读文本(Windows 1252?还有什么?)。

对您而言,更好的方法可能是使用System.IO.FileStream而不是System.IO.TextReader及其爪子,将八位字节的文本八位字节读取为二进制。然后你就有了原始的八位字节,你可以根据需要将它们转换成文本,或者对原始八位字节值进行数学运算。