windows 如何在MingW 64中输入UTF-8字符?

os8fio9y  于 2023-04-22  发布在  Windows
关注(0)|答案(2)|浏览(264)
Platform: Windows x64 22H2

我有以下代码(文件编码格式:UTF-8):

#include <stdio.h>

int main(int argc, char **argv)
{
    static char text[8];
    scanf("%[^\n]s", text);
    printf("%s\n", text);
    return 0;
}

当只输入ASCII表中的字符时,它可以正常工作。
但当输入中文或其他Unicode编码等字符时,它不会读取。
如果输入Unicode字符,则文本数组的内容为:00 00 00 00 00 00 00 00。我在Windows CMD中执行了这个程序,编译指令是:gcc main.c -o main.exe
我正在尝试添加本地支持,这是修改后的代码:

#include <stdio.h>
#include <locale.h>

int main(int argc, char **argv)
{
    setlocale(LC_ALL, "zh_CN.UTF-8");
    static char text[8];
    scanf("%[^\n]s", text);
    printf("%s\n", text);
    return 0;
}

但是这个数组的内容仍然是:00 00 00 00 00 00 00 00
我尝试将CMD的页码再次修改为65001 (chcp 65001),但结果还是一样。我也尝试添加gcc命令行参数-finput-charset=UTF-8,但仍然不起作用。
但是当我把代码文件修改为GB系列的编码(如GB2312)或者把CMD的页码改为936时,它就可以正常读取GB2312编码的数据,如下图所示:

input: 你好
output: ce d2 b5 c4 00 00 00 00

它可以读取Unicode字符,但不能读取UTF-8编码。

1bqhqjot

1bqhqjot1#

尝试<wchar.h>?

#include <wchar.h>

int main()
{
    static wchar_t text[32];
    wscanf(L"%ls", text);
    wprintf(L"%ls\n", text);

    return 0;
}
v8wbuo2f

v8wbuo2f2#

在locale设置为LANG=en_US.UTF-8的bash shell中,它可以正确读取UTF-8字符串。

#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
    char text[100];
    scanf("%99s", text);
    printf("%s\n", text);
    for (int i=0; i < strlen(text); i++)
        printf(" %02x",(unsigned char) text[i]);
    printf("\n");
    return 0;
}

快速的棕色狐狸
快速的棕色狐狸
 e5 bf ab e9 80 9f e7 9a 84 e6 a3 95 e8 89 b2 e7 8b 90 e7 8b b8

相关问题