Что предоставляет `<cuchar>` и где он документирован?
Новый стандарт С++ 11 упоминает заголовок <cuchar>
, предположительно по аналогии с C99 <uchar.h>
.
Теперь мы знаем, что С++ 11 приносит новые типы символов и литералы, которые специально разработаны для UTF16 и UTF32, но я не думал, что язык будет фактически содержат функции для преобразования (зависящего от системы) узкого многобайтового кодирования в одно из кодировок Unicode. Однако я просто столкнулся с синтаксисом заголовка для <cuchar>
, в котором упоминаются функции mbrtoc16
/c16rtombr
и mbrtoc32
/c32rtombr
, которые, похоже, делают именно это.
К сожалению, стандарт ничего не говорит об этих функциях, выходящих за рамки синтаксиса заголовка. Где эти функции определены, что они действительно делают и где я могу больше узнать о них? Означает ли это, что теперь можно использовать правильный Unicode полностью со стандартным С++, не требуя каких-либо дополнительных библиотек?
Ответы
Ответ 1
Они были описаны в документе WG21 от 2005 года, но описания нет в окончательном стандарте. Они документированы в ISO/IEC 19769: 2004 (Расширения для языка программирования C для поддержки новых типов данных символов) (проект), которые C Стандарт ++ 11 относится к.
Текст слишком длинный для публикации здесь, но это подписи:
size_t mbrtoc16(char16_t * pc16, const char * s, size_t n, mbstate_t * ps);
size_t c16rtomb(char * s, char16_t c16, mbstate _t * ps);
size_t mbrtoc32(char32_t * pc32, const char * s, size_t n, mbstate_t * ps);
size_t c32rtomb(char * s, char32_t c32, mbstate_t * ps);
Функции преобразуются между многобайтовыми символами и символами UTF-16 или UTF-32, соответственно, похожими на mbrtowc
. Нет никаких повторных версий и, честно говоря, кому они нужны?
Ответ 2
Вероятно, лучшая документация, о которой я знаю, находится в n1326, предложение добавить TR19769 в стандартную библиотеку C [Edit: хотя, глядя на него, N1010, о котором цитировал Р. Мартиньо Фернандес, похоже, почти такой же].