C-输出中未正确显示字符

C-输出中未正确显示字符,c,character,C,Character,我可以在我的源代码中插入è字符,但这在我的程序的输出中没有正确显示;此时会出现Þ字符 ASCII扩展码中的è字符对应于138 Unicode中的è字符与232数字匹配 ASCII扩展码中的Þ字符对应于232数字 Unicode中的Þ字符与222数字匹配 通过调试器,可以注意到编译器将è转换为数字232,并将整数138转换为字符Š(行列表集),在输出中,字符号232表示为Þ,字符号138表示为è 幕后发生了什么 示例代码: #include <stdio.h> int main (v

我可以在我的源代码中插入
è
字符,但这在我的程序的输出中没有正确显示;此时会出现
Þ
字符

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 'Š'
调试器看到的内容:

#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 'Š'

我猜你在窗户上

您的源代码是Unicode,因此
è
字符被编码为数字232。编译器在生成的程序中使用此值

执行程序时,此代码将作为参数发送到
printf
函数,但由于Windows使用扩展ASCII,因此在控制台中打印时将其解释为
Þ

您可以用扩展ASCII编码文件,使其具有正确的字符

要确定控制台使用的编码,可以在Windows中使用:

#include <windows.h>
unsigned cp = GetConsoleOutputCP();
#包括
无符号cp=GetConsoleOutputCP();
您可以使用以下命令更改控制台编码:

#include <windows.h>
SetConsoleOutputCP(1252); //Set console encoding to Windows 1252
SetConsoleOutputCP(65001); //Set console encoding to utf8
#包括
SetConsoleOutputCP(1252)//将控制台编码设置为Windows 1252
设置控制台输出端口CP(65001)//将控制台编码设置为utf8
这将设置控制台输出而不是控制台输入,因此如果需要处理扩展ASCII用户输入,则需要使用并设置输入编码


您可以看到其他可用的代码页代码。

只需检查是否要写入:

  printf("%d\n\n", 'è');

然后您将看到字符不足以包含正确的值。

源代码的字符代码是什么?您是否收到“实现定义的多字符文字”之类的编译器警告?我没有收到任何警告消息,我不知道我的“源字符代码”到底是什么。但在“编辑器>编码设置”部分的IDE代码::块的设置中,我找到了“WINDOWS-1252”条目启用项,我正在使用WINDOWS。在“编辑器>编码设置”部分的“我的IDE代码::块的设置”中,我发现“WINDOWS-1252”项已启用。是否可以打印unsigned cp=GetConsoleOutputCP()的结果查看我收到一条消息错误:
'GetConsoleOutputCP'未在此范围内声明“
是的,您应该包括windows。h我忘了提及它。抱歉:
#include
如果执行该语句,我会得到
850
的结果,但我认为不会发生这种情况,因为char不能保存
è
值,但是因为整数在
printf
中被解释为由
%d
签名。如果我的
char
变量被声明为
unsigned
,则它可以保存并显示扩展ASCII表中的所有字符,直到
255