Портативный интерфейс 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())

Вся помощь приветствуется.


person iam-tom    schedule 26.05.2015    source источник


Ответы (1)


Есть ли способ избежать широкого API в системах на базе Windows?

Windows API не поддерживает UTF-8, за исключением нескольких избранных API. В основном он поддерживает только зависящие от локали ANSI и UTF-16. Чтобы поддерживать Unicode без потери данных, вы должны использовать API на основе UTF-16.

Ваш интерфейс должен будет внутренне преобразовывать строки UTF-8 в UTF-16 при их передаче функциям API Windows и преобразовывать из 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. Другие поставщики могут предоставлять или не предоставлять аналогичную функциональность.

person Remy Lebeau    schedule 27.05.2015