如何在 MingW64 中输入 UTF-8 字符?

How input UTF-8 characters in MingW64?

提问人:S-N 提问时间:4/19/2023 更新时间:4/19/2023 访问量:266

问:

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 00Windows CMDgcc 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,但结果仍然相同。 我还尝试添加 gcc 命令行参数 ,但仍然不起作用。(chcp 65001)-finput-charset=UTF-8

但是当我将代码文件修改为GB系列的编码(如GB2312)或将CMD的页码修改为936时,它可以正常读取GB2312编码的数据,如下所示:

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

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

C Windows UTF-8 明格 W64

评论

0赞 user694733 4/19/2023
您使用的是旧的 Windows 控制台还是更新的 Windows 终端?我认为控制台有一些终端修复的Unicode错误。也许这就是发生这种情况的原因?
0赞 stark 4/19/2023
这在 bash shell 中工作正常。问题出在您的终端上。

答:

0赞 user18478866 4/19/2023 #1

试试 <wchar.h>?

#include <wchar.h>

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

    return 0;
}

评论

1赞 S-N 4/19/2023
这没关系,但不是 UTF-8.....
1赞 stark 4/19/2023 #2

在 bash shell 中,locale 设置为 LANG=en_US。UTF-8,这将正确读取 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

评论

0赞 S-N 4/20/2023
Windows CMD 不工作...
0赞 stark 4/21/2023
查看 stackoverflow.com/q/57131654/1216776