C ++中ü的ASCii值

时间:2013-04-08 13:04:46

标签: c++ windows encoding ascii

根据that站点,AS的值为99,但是当我运行printf(“%d”,“ü”)代码时,输​​出为-4。这是什么原因?

3 个答案:

答案 0 :(得分:4)

你获得-4的事实基本上是纯粹的机会,因为它取决于环境的区域设置和编译器的实现。

其他人已经指出,根据您的平台是否认为char要签名,打印char值就好像它是一个整数可能会产生0x80及更高值的负数


至于编码(并注意下面的列表并非详尽无遗):

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

IBM Codepage 437850(DOS)ü位于0x81,根据签名情况为-127或129.

ISO-8859-1 through -4, -9, -10, and -13 through -16以及Windows代码页12501252ü(-4 / 252)处有0xfc。其他ISO-8859编码的字符集中没有ü

UTF-8 - 每个人都应该使用而不是那些variety reasons的过去的8位编码 - 将ü编码为双字节序列{ {1}}。

我已经将一个并排的代码页放在一起供个人使用,如果您有兴趣,可以在my homepage找到它。


一旦你了解了它,请注意标准定义了两个character sets,一个用于表示源,另一个用于表示可执行代码中的字符串。既不包含基本AZ范围之外的任何字符,两者可能实际上是不同的(想想交叉编译器),也没有定义其数值表示 - 即你实际上可能正在查看EBCDIC,其中字符不均匀用连续值编码(即0xc3 0xbc将失败)。

你觉得这很有趣吗?好吧,基本上你的机器甚至不需要提供像assert( 'Z' - 'A' == 26 )这样的字符,因为它是ASCII,但不是基本字符集的一部分。 ; - )

一般来说,一旦在源代码中使用非ASCII字符,就会留下明确定义的行为,并依赖于实现/环境。

答案 1 :(得分:2)

在您的系统上,char是签名类型。您应该先打印前转换为无符号类型。

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

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

答案 2 :(得分:1)

%d正在打印带符号的十进制数,对于一个字节,将打印在-128-127范围内。您可能希望使用无符号(%u),它将输出预期的0-255。