我一直在编写旨在在终端上写非英语字符的Linux程序,最近我一直在将其移植到Windows,并且在尝试更改代码页和具有预先定义的符号常量_POSIX_C_SOURCE的终端字体似乎会更改代码的行为,并使其无法正确打印非英文字符,这是我的代码。
#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);
printf("Ћирилични текст\n");
return 0;
}
这是程序输出的内容,取决于我在编译时是否在命令行参数中定义了常量。
C:\Users\User\Desktop>gcc test.c
C:\Users\User\Desktop>a.exe
Ћириличан текст
C:\Users\User\Desktop>gcc -D_POSIX_C_SOURCE=2 test.c
C:\Users\User\Desktop>a.exe
������������������ ����������
这是因为在有效遵守POSIX的情况下,逐字节地输出到标准输出。它使用printf
函数内部执行的操作的不同实现。