Мне известно о ICU и небольших библиотеках, таких как utf8 one в проекте кода (забудьте точное имя), однако ни один из них не является именно тем, что я хочу.C++ вопросы юникода
То, что я действительно хочу, это что-то вроде ОИТ, но обернуто более дружелюбно.
В частности:
- Полностью объектно-ориентированное
- реализациях C++ стандарт потоков или, по крайней мере что-то, что выполняет ту же роль.
- Может форматировать время, даты и т. Д. В зависимости от локали (например, dd/mm/yy в Великобритании и mm/dd/yy в США).
- Позволяет мне выбрать «внутреннюю» кодировку строк, поэтому я могу, например, использовать UTF-16 для окон, чтобы избежать большого количества преобразований при передаче строк в и из окон API и DirectX
- Простое преобразование строк между кодировками
Если такая библиотека не существует, можно обернуть ICU вверх, используя стандарт C++ классы, так что я могу, например, создать ustring, который имеет идентичное использование в StD :: строку и зЬй :: wstring , а также реализовать версии потоков (оптимально, если они полностью совместимы с существующими, то есть я мог бы передать его функции, ожидающей std :: ostream, и будет выполнять преобразование между ее внутренним форматом и d ascii (или utf-8) на лету)? Предполагая, насколько это возможно?
EDIT: Также, взглянув на стандарт C++ 0x и замеченные литералы для utf8, utf16 и utf32, означает ли это, что стандартная библиотека (например, строки, потоки и т. Д.) Полностью поддерживает эти кодировки и преобразование между их? Если да, то кто-нибудь понял, как долго это будет, пока Visual Studio не поддержит эти функции?
EDIT2: Что касается использования существующей поддержки C++, я буду искать язык и фасет.
Одна из проблем, с которыми я столкнулся, заключается в том, что при использовании потоков, определяемых вокруг wchar_t, который составляет 2 байта под окнами для ввода файлов, все же, похоже, он использует ascii для самих файлов.
привело к следующему гекса в файле
48 65 6C 6C 6F 20 57 6F 72 6C 64 0D 0A
, который явно ASCII, а не ожидаемой UTF-16 выход:
FF FE 48 00 65 00 6C 00 6C 00 6F 00 20 00 57 00 6F 00 72 00 6C 00 64 00 0D 00 0A 00
Текст UTF-16 фактически ** преобразован ** в локальную кодировку 8 бит! Таким образом, вы не записываете utf-16 в файл. Не забудьте вызвать std :: locale :: global (std :: locale()); – Artyom
Итак, как я могу сказать, какой кодировкой я хочу получить файл? Я попробовал std :: local ... вы упомянули выше, но он, похоже, не имеет никакого эффекта :( –
Хорошо, например, если система locale 'ru_RU.UTF-8', то кодировка является utf-8, если она ru_RU.KOI-8, то это KOI. Вы также можете указать другой язык: 'locale :: globale (locale (« de_DE.ISO-8859-1 »));» (примечание: я использую имена локалей имен POSIX, для Windows вы должны проверить, что имена локалей: – Artyom