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

时间:2019-03-05 11:56:05

标签: 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;
 }

输出:

Char a: Þ
Char to: 232
    
Char b: 'è'
Char b: 138

调试器看到的内容

char a = 232 'è'
char b = 138 'Š'

2 个答案:

答案 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不足以包含正确的值。