Почему отсутствует std :: u16cout? - PullRequest
13 голосов
/ 16 мая 2011

C ++ 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.

Новый стандарт c ++ 0x определяет еще два типа символов char16_t и char32_t. Однако единственными новыми определениями типов являются std::u16string и std::u32string.

Почему стандартная поставка не std::u16ostream? Или как насчет std::u32cout?

Ответы [ 2 ]

20 голосов
/ 16 мая 2011

Было решено, что реализация Unicode iostreams была слишком большой работой, чтобы того стоить: http://www.open -std.org / ОТК1 / SC22 / wg21 / документы / документы / 2007 / n2238.html

Из бумаги:

Основанием для исключения специализаций потоков двух новых типов было то, что потоки не-типовых типов не получили широкого использования, поэтому не ясно, существует ли реальная необходимость удвоения числа специализаций этого очень сложного механизма.

Исходя из того, что я понимаю, комитет по стандартизации понял, что сериализация в широкие символы (в 2- или 4-байтовых форматах) встречается редко, и там, где вам понадобится UTF-16 или UTF-32, вы всегда можете реализовать это самостоятельно, используя те же самые старые байтовые потоки на основе символов, но с фасетом codecvt для преобразования вашего ввода в UTF-16 / UTF-32, который он может рассматривать как еще один многобайтовый формат.

2 голосов
/ 16 мая 2011

Не знаю официальной причины.

Но я не вижу необходимости в этом.
Имея потоки определенного типа, вы жестко программируете их использование. Я бы предпочел потоки, которые являются общими (обрабатывать байты), которые затем можно настроить для вывода в определенный формат. Как будто они сейчас работают.

Так что внутренне я хочу использовать строки UTF16. Но на выходе я хочу сериализовать их в UTF8 для хранения. Для этого я просто хотел бы создать нормальный поток, наполнив его локалью, которая знает, как преобразовать в UTF16 -> UTF8, тогда все, что нужно сделать потоку - это обработать байты.

Поток понимает формат на диске, так что вам очень мало. Очень удобно иметь локаль, которая может конвертировать различные форматы (на устройстве во внутренний и наоборот).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...