我可以è在源代码中插入字符,但是在程序的输出中不能正确显示该字符;Þ角色出现在它的位置。
该è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;
}
Run Code Online (Sandbox Code Playgroud)
输出:
Char a: Þ
Char to: 232
Char b: 'è'
Char b: 138
Run Code Online (Sandbox Code Playgroud)
调试器看到的内容:
char a = 232 'è'
char b = 138 'Š'
Run Code Online (Sandbox Code Playgroud)
我猜你在Windows上。
发生的情况是您的源代码使用Unicode,因此该è字符被编码为数字232。编译器在生成的程序中使用此值。
执行程序时,此代码将作为参数发送给printf函数,但是由于Windows使用扩展ASCII,因此将其解释为Þ在控制台中打印时。
您可以使用扩展ASCII编码文件以具有正确的字符。
要确定控制台使用哪种编码,可以在Windows中使用它:
#include <windows.h>
unsigned cp = GetConsoleOutputCP();
Run Code Online (Sandbox Code Playgroud)
您可以使用以下方法更改控制台编码:
#include <windows.h>
SetConsoleOutputCP(1252); //Set console encoding to Windows 1252
SetConsoleOutputCP(65001); //Set console encoding to utf8
Run Code Online (Sandbox Code Playgroud)
这将设置控制台输出而不是控制台输入,因此,如果您需要处理扩展的ASCII用户输入,则需要使用GetConsoleCP()和SetConsoleCP()来设置输入编码。
您可以在此处查看其他可用的代码页代码。