Какая локаль LC_CTYPE используется для консольного приложения Windows Unicode? - PullRequest
0 голосов
/ 09 ноября 2018

При преобразовании многобайтового консольного приложения в Unicode я столкнулся со странной проблемой, когда _tcprintf и WriteConsole работали нормально, но _tprintf печатал неправильные символы ...

Я проследил это до использования setlocale(LC_ALL, "C"), которое использует LC_CTYPE из 1 байта на основе MS doc:

Языковой стандарт C предполагает, что все типы данных char имеют размер 1 байт и что их значение всегда меньше 256.

Однако, Я хочу сохранить "C" для всего, кроме LC_CTYPE, но я не знаю, что использовать?

Я думал, что весь смысл использования UTF16 заключается в том, что все символы доступны, и все будет печататься правильно, независимо от кодовой страницы или локали.

Несмотря на то, что в приложении Unicode также отображается настройка вывода на консоль UTF-8 (65001) (SetConsoleCP, которая, конечно, не связана с локалью), и при выводе UTF16 также возникают проблемы с отображением правильных символов.

В любом случае, кто-нибудь знает, какое значение я должен использовать LC_CTYPE для UTF16 в консольном приложении Windows Unicode? Может быть, это так же просто, как setlocale( LC_CTYPE, "" );? ТИА !!

1 Ответ

0 голосов
/ 09 ноября 2018

Используйте _setmode () , чтобы установить режим перевода файла на _O_U16TEXT:

#include <fcntl.h>
#include <io.h>
#include <stdio.h>

int main(void)
{
    _setmode(_fileno(stdout), _O_U16TEXT);
    wprintf(L"ελληνικά\n");
}
...