C# 字符到整数的转换以获得ASCII码

C# 字符到整数的转换以获得ASCII码,c#,C#,这可能是一个不成熟的问题,可能是我遗漏了什么,但我的问题是 尝试将char转换为int以获取该char的ASCII值,在大多数情况下,我会获得特定char的正确/预期ASCII代码,在某些情况下我不会。有人能解释一下为什么吗 示例: // Example 1:- Console.WriteLine((int)'a'); // gives me 97 perfect! // Example 2:- Console.WriteLine((char)1); gives me ☺ //

这可能是一个不成熟的问题,可能是我遗漏了什么,但我的问题是

尝试将
char
转换为
int
以获取该
char
的ASCII值,在大多数情况下,我会获得特定
char
的正确/预期ASCII代码,在某些情况下我不会。有人能解释一下为什么吗

示例:

// Example 1:-   

Console.WriteLine((int)'a');

// gives me 97 perfect!

// Example 2:-

Console.WriteLine((char)1); gives me ☺

// now 

Console.WriteLine((int )'☺');

// this should give me 1, instead it gives me 9786 why?

这发生在ASCII>
127
或ASCII32

\01
是不可打印字符时,因为结果控制台可以自由使用任何替换使其可见


另外,默认的Windows控制台对Unicode不是很友好,所以当您打印默认可打印ASCII范围之外的字符时,会发生奇怪的事情。

首先,没有“ASCII>127”这样的东西-ASCII只升到127(或126;我永远记不起删除是否是ASCII的正确部分)

基本上,当您打印出不可打印的字符(如U+0001(“标题开始”)时,由显示设备决定如何处理该字符。有些控制台会打印正方形,有些会打印笑脸,等等。你当然不应该期望它是可逆的。您可以期望转换本身在代码中是可逆的,但是:

char c = '\u0001';
int i = c; // i = 1
char d = (char) i;
Console.WriteLine(c == d); // True

在回答您的问题时,为什么
Console.WriteLine((int)'☺');返回9786,这是因为'☺' 在Unicode中,字节5838表示,整数表示为9786


c#中的字符是Unicode字符。

这可能就是您想要的:我不相信显示的字符是基础字符值的唯一表示形式,尤其是那些低值字符。@DineshB:那不是ASCII。“扩展ASCII”是一个可怕的术语,通常意味着“与ASCII兼容的任何单字节编码,最多127个。”请参阅-“ASCII包含128个字符的定义”Gotchu,我的错,然后将其引用为ASCII