2015-08-27 129 views
1

在C#中我需要获取某些字符的ASCII码。 因此,我将char转换为byteint,然后打印结果。ASCII码字符

String sample="A"; 
int AsciiInt = sample[0]; 
byte AsciiByte = (byte)sample[0]; 

对于ASCII码为128或更小的字符,我可以得到正确的答案。
但对于大于128的字符,我得到无关紧要的答案!

我确定所有字符都小于0xFF。

我还测试了System.Text.Encoding并得到了相同的结果。

例如:我得到172对于实际字节值为129的字符!

其实ASCII字符像ƒ,‡,<,“¥,©,我,³,·,½,»,A
每个字符占用1个字节,并上升到超过193 我猜有一个Unicode等价物,因为它们将字符串解释为Unicode!
如果SomeOne需要访问字节的实际值,它是否是有效的已知ASCII字符或不是!

+1

你认为哪个角色有一个“129实际字节值”? –

+0

(而您是如何获得这样的性格?) –

+0

我更新了我的问题,这似乎.NET犯规认识他们!我打开写入的文件使用VS二进制编辑器这些字符而我看到的实际字节。 – Hamed

回答

4

但对于人物上超过128个,我得到答非所问

不,你不会。您将获得对应于char的UTF-16代码单元的底部8位。

现在如果你的文本都是ASCII码,那就好了 - 因为无论如何ASCII只能达到127。这听起来像你实际上在其他一些编码期待的表示 - 所以你需要找出哪些编码是,在这一点上,你可以使用:

Encoding encoding = ...; 
byte[] bytes = encoding.GetBytes(sample); 
// Now extract the bytes you want. Note that a character may be represented by more than 
// one byte. 

如果你基本上找的编码将字节0到255分别视为U + 0000到U + 00FF,则应使用ISO-8859-1,您可以使用Encoding.GetEncoding(28591)访问ISO-8859-1。

+0

其实我的工作与所用特殊字体字符的家庭,代表波斯语,每个字符需要1个字节,并上升到超过193 – Hamed

+2

@hamednaseri:那是肯定*不* ASCII,你需要找出哪些编码你实际使用。 (据我所知,Unicode不包含U + 0000到U + 00FF范围内的任何波斯语字符,所以我认为你需要仔细看看这个......可能你的字体实际上只是提供完全不同的Unicode字符的字形...) –

+0

是的它不是ASCII码,我用ANSI来保存NotePad中的字符(每个字符1字节)。然后我打开字节假设每个字节值是它的ASCII码!微不足道的错误。感谢您的描述。 – Hamed

1

你不能忽略编码的问题。字节和字符之间没有固有映射 - 这是由编码定义的。

如果我使用你的例子131,在我的系统上,这产生â。不过,既然你阿拉伯语系统上明显的时候,你最有可能的是Windows-1256编码,这对于131

换句话说产生ƒ,如果你需要使用正确的编码转换字符字节和副当反之亦然。在你的情况下,

var sample = "ƒ"; 
var byteValue = Encoding.GetEncoding("windows-1256").GetBytes(sample)[0]; 

它产生131,你似乎期望。最重要的是,这将适用于所有电脑 - 如果你想拥有这个系统区域特定的,Encoding.Default也可以为你工作。

您的方法似乎适用于128以下字节的唯一原因是在UTF-8中,字符对应于ASCII标准映射。但是,您滥用术语ASCII - 它只是指这些7位字符。你所说的ASCII实际上是一个扩展的8位字符集 - 所有带有8位集的字符都是与字符集相关的。

我们不再在这个世界上的时候,你可以假设你的应用程序将只与你有相同的语言环境的计算机上运行 - .NET是专为这一点,这就是为什么所有的字符串都是Unicode的。至少,请阅读http://www.joelonsoftware.com/articles/Unicode.html以了解编码如何工作,并解决您似乎具有的一些严重和危险的误解。

+0

很好的解释和好的文章,我对Unicode和编码有几个误解。 – Hamed