ASCII 字符码

ASCII Code Of Characters

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

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

对于 ASCII 码 128 及以下的字符,我得到了正确答案。
但是对于大于 128 的字符,我会得到不相关的答案!

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

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

例如:我得到 172 For a char with actual byte value of 129!

实际上是 ASCII 字符,如 ƒ , ‡ , ‹ , “ , ¥ , © , Ï ​​, ³ , · , ½ , » , Á
每个字符占用1 个字节,最多可达 193 个以上。 我猜他们和 .Net 有一个 Unicode 等价物 Return 因为将字符串解释为 Unicode!
如果有人需要访问字节的实际值,无论它是否是有效的已知 ASCII 字符,该怎么办!!!

But For Characters Upper Than 128 I get Irrelevant answers

不,你不知道。你得到了对应于 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) 访问它.

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

如果我使用你的 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 了解编码如何工作的解释,并摆脱您似乎拥有的一些严重和危险的误解。