我可以在源代码中插入è
字符,但这不能正确显示在程序的输出中;会出现Þ
字符。
ASCII扩展中的è
字符对应于138
。
Unicode中的è
字符与232
数字匹配。
ASCII扩展中的Þ
字符对应于232
数字。
Unicode中的Þ
字符与222
数字匹配。
通过调试器,可能会注意到编译器将è
转换为数字232
,并将整数138
转换为字符Š
(行制表集),在输出时,字符号232
表示为Þ
,字符号138
表示为è
。
幕后发生了什么事?
示例代码:
#include <stdio.h>
int main (void)
{
unsigned char a = 'è';
unsigned char b = 138;
printf ("Char a:% c \ n", a);
printf ("Char a:% d \ n \ n", a);
printf ("Char b:% c \ n", b);
printf ("Char b:% d \ n \ n", b);
return 0;
}
输出:
Char a: Þ
Char to: 232
Char b: 'è'
Char b: 138
调试器看到的内容
char a = 232 'è'
char b = 138 'Š'
答案 0 :(得分:5)
我猜你在Windows上。
发生的事情是您的源代码使用Unicode,因此è
字符被编码为数字232。编译器在生成的程序中使用此值。
执行程序时,此代码将作为参数发送到printf
函数,但是由于Windows使用扩展ASCII,因此在控制台中将其解释为Þ
。
您可以使用扩展ASCII编码文件以具有正确的字符。
要确定您的控制台使用哪种编码,可以在Windows中使用它:
#include <windows.h>
unsigned cp = GetConsoleOutputCP();
您可以使用以下命令更改控制台编码:
#include <windows.h>
SetConsoleOutputCP(1252); //Set console encoding to Windows 1252
SetConsoleOutputCP(65001); //Set console encoding to utf8
这将设置控制台输出而不是控制台输入,因此,如果需要处理扩展的ASCII用户输入,则需要使用GetConsoleCP()和SetConsoleCP()来设置输入编码。
您可以看到其他可用的代码页代码here。
答案 1 :(得分:0)
只需检查是否要写:
printf("%d\n\n", 'è');
然后您将看到char不足以包含正确的值。