UTF-8 в Windows - PullRequest
       22

UTF-8 в Windows

26 голосов
/ 03 октября 2008

Как мне установить кодовую страницу на UTF-8 в программе на C Windows?

У меня есть сторонняя библиотека, которая использует fopen для открытия файлов. Я могу использовать wcstombs для преобразования имен файлов Unicode в текущую кодовую страницу, однако, если у пользователя есть имя файла с символом вне кодовой страницы, это нарушается.

В идеале я бы просто позвонил _setmbcp (65001), чтобы установить кодовую страницу в UTF-8, однако в документации MSDN для _setmbcp говорится, что UTF-8 не поддерживается.

Как мне обойти это?

Ответы [ 4 ]

26 голосов
/ 03 октября 2008

К сожалению, нет способа сделать Unicode текущей кодовой страницей в Windows. Константы CP_UTF7 и CP_UTF8 являются псевдокодовыми страницами, используемыми только в MultiByteToWideChar и WideCharToMultiByte функциях преобразования, как упоминалось Беном.

Ваша проблема похожа на проблему классов Fstream C ++. Конструкторы fstream принимают только char* имен, что делает невозможным открытие файла с истинным именем Unicode. Единственное решение, предлагаемое VC, - это хак: открыть файл отдельно, а затем установить дескриптор объекта потока. Боюсь, что это не вариант для вас, конечно, поскольку сторонняя библиотека, вероятно, не принимает дескрипторы.

Единственное решение, которое я могу придумать, - это создать временный файл с не-Unicode-именем, которое жестко связано с оригиналом, и использовать его в качестве параметра.

10 голосов
/ 03 октября 2008

Все Windows API-интерфейсы думают в UTF-16, так что вам лучше написать оболочку вокруг вашей библиотеки, которая преобразует границы.

Как ни странно, Windows считает UTF-8 кодовой страницей для целей преобразования, поэтому вы используете те же API, что и для преобразования между кодовыми страницами:

std::wstring Utf8ToUtf16(const char* u8string)
{
    int wcharcount = strlen(u8string);
    wchar_t *tempWstr = new wchar_t[wcharcount];
    MultiByteToWideChar(CP_UTF8, 0, u8string, -1, tempWstr, wcharcount);
    wstring w(tempWstr);
    delete [] tempWstr;
    return w;
}

И нечто похожее по форме для конвертации обратно.

2 голосов
/ 07 мая 2018

2018 обновление: Windows 10 сделала кодовую страницу «65001» меньше «псевдо» в два этапа:

  1. conhost изменения: Подсистема Windows для Linux использует кодовую страницу 65001 для своих консолей. Также возможно запустить chcp 65001 в cmd.exe начиная с WSL. (Это вызвало некоторые довольно глупые ошибки Python .)
  2. полнофункциональный языковой стандарт: Windows начиная со сборки 17035 позволяет установить UTF-8 в качестве кодовой страницы языкового стандарта . Это доступно из апрельского обновления 2018 года.
0 голосов
/ 06 января 2011

Используйте cygwin (который по умолчанию обеспечивает локаль UTF-8) или напишите свой собственный взлом libc для Windows, который выполняет необходимые переводы с UTF-8 в UTF-16 и упаковывает нестандартные функции _wfopen и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...