ASCII 字符码
ASCII Code Of Characters
在C#中我需要获取一些字符的ASCII码。
所以我将 char
转换为 byte
或 int
,然后打印结果。
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 了解编码如何工作的解释,并摆脱您似乎拥有的一些严重和危险的误解。
在C#中我需要获取一些字符的ASCII码。
所以我将 char
转换为 byte
或 int
,然后打印结果。
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
.
现在,如果您的文本全部为 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 了解编码如何工作的解释,并摆脱您似乎拥有的一些严重和危险的误解。