Нет потоков Unicode в C ++ 0x?Зачем? - PullRequest
6 голосов
/ 14 апреля 2011

Сегодня я обнаружил, что стандартная комиссия C ++ отказалась от поддержки потоков Unicode в C ++ 0x во второй ревизии.Для получения дополнительной информации см. этот вопрос.

Согласно этому документу:

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

С это интервью со Страуструпом:

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

Я не эксперт в Unicode, и мне интересно, почему реализация потоков Unicode так сложна?Что с этим проблемного?

Ответы [ 2 ]

5 голосов
/ 14 апреля 2011

Первый абзац, который вы цитировали, говорит вам: дело не в том, что потоки Unicode в частности более сложны, чем другие потоки, а в том, что потоки iostream в целом чрезвычайно сложны.Таким образом, реализация iostream Unicode затруднена не потому, что они являются Unicode, а потому, что они iostream .

3 голосов
/ 14 апреля 2011

Статья N2238 относится к 2007 году и не имеет отношения к делу. Я не уверен, о чем конкретно говорит Страуструп в интервью, но это не последние новости.

N3242 §22.5 по-прежнему требуется codecvt_utf8 и codecvt_utf16, которые все, что вам нужно для файлового ввода-вывода Unicode. imbue правильный фасет на wcout, и все должно быть хорошо ... если у вас есть совместимая библиотека. Однако на практике GCC и MSVC уже поставляют UTF-8, и я ожидаю, что каждая серьезная платформа C ++ сохраняет паритет между mbstowcs и codecvt.

Там может быть путаница, потому что N3242 § 22.5 / 5 говорит

- Многобайтовые последовательности могут быть записаны только в виде двоичного файла. Попытка записи в текстовый файл производит неопределенное поведение.

Это связано с тем, что ввод / вывод в текстовом режиме преобразует окончания строк, поэтому байт 0x10 как половина 16-битного слова UTF-16 можно преобразовать в 0x13, 0x10, что приведет к повреждению потока. Это не имеет ничего общего с плохой поддержкой ... просто обязательно откройте файл в двоичном режиме, как и в случае с любой библиотекой, предоставляющей такие функции.

...