Портативный интерфейс 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. Другие поставщики могут предоставлять или не предоставлять аналогичные функции.

Другие вопросы по тегам