Почему std:: u16cout отсутствует?
С++ 03 определяет два типа символов: char
и wchar_t
. (позволяет игнорировать безумие signed char
и unsigned char
).
Эти два символа затем применяются к std::basic_string
, std::basic_ostream
и т.д. как std::string/std::wstring
и std::ostream/std::wostream
.
В потоках стандартная библиотека также определяет глобальные переменные std::cout
и std::wcout
.
Новый стандарт С++ 0x определяет еще два типа символов char16_t
и char32_t
. Однако единственными новыми typedef являются std::u16string
и std::u32string
.
Почему стандартная поставка a std::u16ostream
? Или как насчет std::u32cout
?
Ответы
Ответ 1
Было решено, что реализация Unicode iostreams - это слишком много работы, чтобы стоить того:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2238.html
Из статьи:
Обоснование отсутствия специализации потока двух новых типов состояло в том, что потоки типов не char не привлекали широкого использования, поэтому неясно, что существует настоятельная потребность в удвоении числа спекализаций этого очень сложного механизма,
Из того, что я понимаю, стандартный комитет понял, что сериализация для широкоформатных (2- или 4-байтных форматов) является необычной, и где вам нужны UTF-16 или UTF-32, вы всегда можете реализовать ее самостоятельно, используя те же старые char байт-потоки, но с фасеткой codecvt, чтобы преобразовать ваш вход в UTF-16/UTF-32, который он мог бы рассматривать как еще один-многобайтовый формат.
Ответ 2
Я не знаю официальной причины.
Но я не вижу необходимости в одном.
Имея потоки определенного типа, вы используете жесткое кодирование. Я бы предпочел потоки, которые являются общими (обрабатывают байты), которые затем можно настроить для вывода в определенный формат. Как они в настоящее время работают.
Таким образом, я хочу использовать строки UTF16. Но на выходе я хочу сериализовать их для UTF8 для хранения. Для этого я бы просто выделил, чтобы создать нормальный поток, наполнить его языковой версией, которая знает, как конвертировать из UTF16 → UTF8, тогда весь поток должен выполнять обработку байтов.
Поток понимает формат на диске, вы очень мало. Наличие языка, который может конвертировать между различными форматами (на устройстве на внутренний и наоборот), очень удобен.