Мне известны ICU и небольшие библиотеки, такие как utf8, одна в проекте кода (забудьте точное имя), однако ни одна из них не является именно тем, что я хочу.
Что я действительно хочу, так это что-то вроде ICU, но в более дружеской манере.
В частности:
- Полностью ориентированный на объект
- Реализации стандартных потоков c ++ или хотя бы что-то, выполняющее ту же роль.
- Может форматировать время, даты и т. Д. В зависимости от локали (например, дд / мм / гг в Великобритании и мм / дд / гг в США).
- Позволяет мне выбрать «внутреннюю» кодировку строк, поэтому я могу, например, заставить ее использовать UTF-16 в окнах, чтобы избежать большого количества преобразований при передаче строк в и из Windows API и DirectX
- Простое преобразование строк между кодировками
Если такой библиотеки не существует, можно ли обернуть ICU, используя стандартные классы c ++, поэтому я могу, например, создать ustring, которая будет идентично std :: string и std :: wstring, а также реализовать версии потоков (оптимально с их полной совместимостью с существующими, то есть я мог бы передать его функции, ожидающей std :: ostream, и она выполнит преобразование между своим внутренним форматом и ascii (или utf-8) на лету) ? Предполагая, что это возможно, сколько работы это будет?
EDIT:
Также, посмотрев на стандарт c ++ 0x и заметив литералы для utf8, utf16 и utf32, означает ли это, что стандартная библиотека (например, строки, потоки и т. Д.) Будет полностью поддерживать эти кодировки и преобразование между ними? Если да, то кто-нибудь знает, сколько времени пройдет, пока Visual Studio не будет поддерживать эти функции?
EDIT2:
Что касается использования существующей поддержки c ++, я посмотрю материал локали и аспектов.
Одна из проблем, с которыми я столкнулся, заключается в том, что при использовании потоков, определенных вокруг 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