字符的ASCII码

本文关键字:ASCII 字符 | 更新日期: 2023-09-27 18:09:58

在c#中,我需要得到一些字符的ASCII码。因此,我将char转换为byteint,然后打印结果。

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

对于ASCII码小于等于128的字符,我得到正确的答案。
但是对于大于128个字符,我得到的答案是不相关的!

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

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

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

实际上是ASCII字符,如 f,‡,[,",¥,©,Ï,³,·,½,»,Á
每个字符占用1字节,最多超过193。我猜有一个Unicode等效的它们和。net返回,因为将字符串解释为Unicode!
如果有人需要访问字节的实际值,无论它是否是一个有效的已知ASCII字符!!

字符的ASCII码

但是对于大于128的字符,我得到无关的答案

不,你没有。你得到UTF-16编码单元的底部8位,对应char

现在,如果您的文本都是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)访问。

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

如果我使用您的示例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以获得编码工作原理的解释,并消除您似乎有的一些严重和危险的误解。