C-输出中的字符显示不正确

Ale*_*lio 3 c character

我可以è在源代码中插入字符,但是在程序的输出中不能正确显示该字符;Þ角色出现在它的位置。

è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)

Adr*_*ien 5

我猜你在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()来设置输入编码。

您可以在此处查看其他可用的代码页代码。