Портативный интерфейс UTF-8 (Windows и Unix) без широкого API
Я устанавливаю путь к файлу на жестком диске, используя следующий интерфейс:
void setPath(const char* path);
Этот путь будет использоваться для базового файлового ввода-вывода.
Если я, например, предоставлю путь, содержащий китайские символы (например, через QString::toUtf8()), это прекрасно работает для Unix, но, конечно, не для Windows из-за внутреннего использования API wchar / wstring.
Сейчас я ищу элегантный способ сделать этот интерфейс совместимым с UTF-8 в системах на базе Windows и Unix. Есть ли способ избежать широкого API в системах на базе Windows и продолжать использовать std:: string и std::ofstream()?
После просмотра boost:: locale это представляется мне возможностью обрабатывать кодировку UTF-8. Будет ли это правильным способом (например, замена std:: ofstream его аналогами boost::ofstream()?)
const std::locale loc = generator.generate(std::locale(), "zh_CN.UTF-8");
std::locale::global(loc);
std::cout.imbue(std::locale());
boost::filesystem::path::imbue(std::locale())
Вся помощь приветствуется.
1 ответ
Есть ли способ избежать широкого API в системах на базе Windows?
Windows API не поддерживает UTF-8, за исключением нескольких избранных API. В основном он поддерживает только ANSI и UTF-16, зависящие от локали. Чтобы поддерживать Unicode без потери данных, вы должны использовать API на основе UTF-16.
Ваш интерфейс должен будет внутренне преобразовывать строки UTF-8 в UTF-16 при передаче их функциям Windows API и преобразовывать из UTF-16 в UTF-8 при получении данных от API. Другого пути нет. Это относится к вашей базовой логике, специфичной для платформы, а не к общедоступному интерфейсу верхнего уровня.
и продолжать использовать std::string и std::ofstream()?
Ты можешь использовать std::string
для UTF-8, и есть много способов конвертировать между std::string
UTF-8 и std::wstring
UTF-16 (в C++11 есть даже классы для этого).
Microsoft имеет нестандартные расширения std::ifstream
а также std::ofstream
в Visual Studio, чтобы принимать имена файлов UTF-16. Другие поставщики могут предоставлять или не предоставлять аналогичные функции.