C语言 在 cmd 上打印到 stderr 无法打印非 ASCII UTF-8 文本的第一个字符



这是我的代码的样子:

#include <windows.h>
#include <stdio.h>
int main()
{
SetConsoleCP(CP_UTF8);
SetConsoleOutputCP(CP_UTF8);
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_FONT_INFOEX cfie;
ZeroMemory(&cfie, sizeof(cfie));
cfie.cbSize = sizeof(cfie);
lstrcpyW(cfie.FaceName, L"Lucida Console");
SetCurrentConsoleFontEx(hStdOut, 0, &cfie);
fprintf(stderr, "нијen");
}

输出是这样的:

��ијe

当印刷线替换为:printf("нијen");

输出是预期的:

нијe

我可能应该提到我用MinGW-GCC编译了这个并在CMD中运行它。

SetConsoleOutputCP()对我有用。甚至"Consolas"作为字体也能给出正确的字符。

#include <windows.h>
#include <stdio.h>
int main()
{
fprintf(stderr, "нијen");
SetConsoleOutputCP(CP_UTF8);
fprintf(stderr, "нијen");
}

我使用 MinGW-W64 的 GCC 8.1.0 编译:

> gcc -Wall -Wextra -pedantic console.c -o console.exe

操作系统是Windows 10(1903(,使用以下命令行在命令提示符下运行:

> for %i in (850 1252 65001) do ( mode con cp select=%i & console.exe & mode con /status )

它产生以下输出(德语区域设置,抱歉(:

> (mode con cp select=850   & console.exe   & mode con /status  )
Status von Gerät CON:
---------------------
Zeilen:          9999
Spalten:         120
Wiederholrate:   31
Verzögerungszeit:1
Codepage:        850
ð¢ð©Ðÿe
нијe
Status von Gerät CON:
---------------------
Zeilen:          9999
Spalten:         120
Wiederholrate:   31
Verzögerungszeit:1
Codepage:        850
> (mode con cp select=1252   & console.exe   & mode con /status  )
Status von Gerät CON:
---------------------
Zeilen:          9999
Spalten:         120
Wiederholrate:   31
Verzögerungszeit:1
Codepage:        1252
нијe
нијe
Status von Gerät CON:
---------------------
Zeilen:          9999
Spalten:         120
Wiederholrate:   31
Verzögerungszeit:1
Codepage:        1252
> (mode con cp select=65001   & console.exe   & mode con /status  )
Status von Gerät CON:
---------------------
Zeilen:          9999
Spalten:         120
Wiederholrate:   31
Verzögerungszeit:1
Codepage:        65001
нијe
нијe
Status von Gerät CON:
---------------------
Zeilen:          9999
Spalten:         120
Wiederholrate:   31
Verzögerungszeit:1
Codepage:        65001

请注意:如果您想要stderr的句柄,请使用STD_ERROR_HANDLE而不是STD_OUTPUT_HANDLE

相关内容

  • 没有找到相关文章

最新更新