这是我的代码的样子:
#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
。