C++ 中 ü 的 ASCii 值

ASCii value of ü in C++

本文关键字:ASCii C++      更新时间:2023-10-16

根据该站点的ASCii值ü是129,但当我运行printf("%d",'ü')代码时,输出是-4。这是什么原因呢?

您得到-4的事实基本上是纯粹的机会,因为它取决于您的环境的语言环境设置和编译器的实现。

其他人已经指出,根据您的平台是否认为char已签名,如果将char值当作整数打印,则0x80或更大的值可能会产生负数。


至于编码(请注意,下面的列表绝不是详尽无遗的):

ü没有ASCII值,因为(US-) ASCII只定义0x7f(127)以内的字符。

IBM Codepage 437和850 (DOS)有ü0x81,这是-127或129取决于签名。

ISO-8859-1到-4,-9,-10,-13到-16以及Windows代码页1250和1252在0xfc(-4/252)处有ü。其他ISO-8859编码在其字符集中没有ü

UTF-8——由于各种原因,每个人都应该使用它来代替过去的8位编码——将ü编码为两字节序列0xc3 0xbc

我已经把一个并排的代码页放在一起供个人使用,如果你感兴趣,你可以在我的主页上找到它。


一旦你接受了这一点,就要注意标准定义了两个字符集,一个用于表示源代码,另一个用于表示可执行代码中的字符串。两者都不包含任何超出基本A-Z范围的字符,两者实际上可能是不同的(考虑交叉编译器),并且两者都没有定义其数字表示-例如,您实际上可能正在查看EBCDIC,其中字符甚至没有用连续值编码(即assert( 'Z' - 'A' == 26 )将失败)。

你觉得好笑吗?嗯,基本上你的机器甚至不需要提供像@这样的字符,因为那是ASCII,但是不是基本字符集的一部分。: -)

一般来说,一旦您在源代码中使用非ascii字符,您就放弃了定义良好的行为,而依赖于实现/环境。

在您的系统中char是有符号类型。在打印前应先转换为无符号类型。

printf("%d", (unsigned char)'ü');

这是否会打印您期望的129是另一回事,但它至少会在执行字符集中打印ü的编码。

%d打印的是一个带符号的十进制数,对于一个字节来说,打印的范围是-128-127)。您可能想使用unsigned (%u),它将输出预期的0-255。