При печати в stderr на cmd не печатается первый символ текста не-ASCII UTF-8 - PullRequest
0 голосов
/ 05 октября 2019

Вот как выглядит мой код:

#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, "нијe\n");
}

Вывод такой:

��ијe

Когда строка печати заменяется на: printf("нијe\n");

Ожидаемый результат:

нијe

Я должен упомянуть, что скомпилировал это с MinGW-GCC и запустил в CMD.

1 Ответ

1 голос
/ 05 октября 2019

Только у меня работает SetConsoleOutputCP(). Даже "Consolas" в качестве шрифта дает правильные символы.

#include <windows.h>
#include <stdio.h>

int main()
{
    fprintf(stderr, "нијe\n");
    SetConsoleOutputCP(CP_UTF8);
    fprintf(stderr, "нијe\n");
}

Я компилирую с MinGW-W64 GCC 8.1.0 :

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

ОС Windows10 (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

Просто примечание:Используйте STD_ERROR_HANDLE вместо STD_OUTPUT_HANDLE, если вам нужен дескриптор stderr.

...