1

我一直在编写一个旨在在终端上编写非英文字符的 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
������������������ ����������
4

1 回答 1

1

这是因为当 POSIX 合规生效时,输出到标准输出是逐字节完成的。它使用函数内部完成的不同实现printf

于 2019-10-05T17:37:02.260 回答