Какие новые функции Unicode есть в C ++ 0x? - PullRequest
19 голосов
/ 18 мая 2010

В нескольких источниках упоминалось, что в C ++ 0x будет улучшена поддержка Unicode на уровне языка (включая типы и литералы).

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

  1. Предоставляет ли новая библиотека стандартные методы для преобразования UTF-8 в UTF-16 и т. Д .?
  2. Позволяет ли новая библиотека записывать UTF-8 в файлы, на консоль (или из файлов, с консоли). Если да, можем ли мы использовать cout или нам нужно что-то еще?
  3. Включает ли новая библиотека «базовые» функции, такие как: определение количества байтов и длины строки UTF-8, преобразование в верхний / нижний регистр (учитывает ли это влияние локалей?)

Наконец, доступны ли какие-либо из этих функций в каких-либо популярных компиляторах, таких как GCC или Visual Studio?

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

1 Ответ

13 голосов
/ 18 мая 2010

Предоставляет ли новая библиотека стандартные методы для преобразования UTF-8 в UTF-16 и т. Д .?
Нет. Новая библиотека предоставляет std::codecvt фасетов, которые выполняют преобразование для вас при работе с iostream. Технический отчет по Unicode C ISO / IEC TR 19769: 2004 почти дословно включен в новый стандарт.

Позволяет ли новая библиотека записывать UTF-8 в файлы, на консоль (или из файлов, с консоли). Если да, можем ли мы использовать cout или нам нужно что-то еще?
Да, вы бы просто наполнили cout правильным codecvt фасетом. Обратите внимание, что консоль не обязана правильно отображать эти символы

Включает ли новая библиотека «базовые» функции, такие как: обнаружение количества байтов и длины строки UTF-8, преобразование в верхний / нижний регистр (учитывает ли это влияние локалей?)
AFAIK, что функциональность существует с существующим стандартом C ++ 03. std::toupper и std::towupper, конечно, функционируют так же, как и в предыдущих версиях стандарта. Для этого нет никаких новых функций, которые специально работают с юникодом.

Если вам нужны такие вещи, вам все равно придется полагаться на внешнюю библиотеку - <iostream> - это основная часть, которая была модифицирована.

Что, конкретно , добавлено для юникода в новом стандарте?

  • Литералы Unicode, через u8 "", u "" и U ""
  • std::char_traits классы для UTF-8, UTF-16 и UTF-32
  • mbrtoc16, c16rtomb, mbrtoc32 и c32rtomb от ISO / IEC TR 19769: 2004
  • std::codecvt фасеты для библиотеки локалей
  • Шаблон класса std::wstring_convert (который использует механизм codecvt для преобразования кодовых наборов)
  • std::wbuffer_convert, который делает то же самое, что и wstring_convert, за исключением необработанных массивов, а не строк.
...