Я знаю о ICU и небольших библиотеках, таких как utf8, в проекте кода (забудьте точное название), однако ни одна из них не совсем то, что я хочу.
Чего я действительно хочу, так это что-то вроде ICU, но в более дружелюбной манере.
Конкретно:
- Полностью объектно-ориентированный
- Реализации стандартных потоков С++ или, по крайней мере, что-то, что выполняет ту же роль.
- Может форматировать время, даты и т. д. в зависимости от региона (например, дд/мм/гг в Великобритании и мм/дд/гг в США).
- Позволяет мне выбрать «внутреннюю» кодировку строк, поэтому я могу, например, использовать UTF-16 в Windows, чтобы избежать большого количества преобразований при передаче строк в Windows API и DirectX и обратно.
- Простое преобразование строк между кодировками
Если такой библиотеки не существует, можно ли обернуть ICU, используя стандартные классы С++, поэтому я могу, например, создать ustring, который имеет такое же использование, как std::string и std::wstring, а также реализовать версии потоков (оптимально, чтобы они были полностью совместимы с существующими, т.е. я мог бы передать его функции, ожидающей std::ostream, и она будет выполнять преобразование между своим внутренним форматом и ascii (или utf-8) на лету)? Если предположить, что это возможно, сколько работы это будет?
РЕДАКТИРОВАТЬ: Кроме того, просмотрев стандарт С++ 0x и заметив литералы для utf8, utf16 и utf32, означает ли это, что стандартная библиотека (например, строки, потоки и т. д.) будет полностью поддерживать эти кодировки и преобразование между ними? Если да, то кто-нибудь знает, сколько времени пройдет, пока Visual Studio не будет поддерживать эти функции?
EDIT2: Что касается использования существующей поддержки С++, я посмотрю локаль и фасет.
Одна из проблем, с которой я столкнулся, заключается в том, что при использовании потоков, определенных вокруг wchar_t, который составляет 2 байта под окнами для файлового ввода-вывода, однако, похоже, он по-прежнему использует ascii для самих файлов.
std::wofstream file(L"myfile.txt", std::ios::out);
file << L"Hello World!" << std::endl;
привел к следующему шестнадцатеричному коду в файле
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
ru_RU.UTF-8то кодировка utf-8 если ru_RU.KOI-8 то KOI. Вы также можете указать другую локаль:locale::globale(locale("de_DE.ISO-8859-1"));(Обратите внимание, я использую имена локалей POSIX, для Windows вы должны проверить, какие имена локалей - person Artyom   schedule 07.05.2009