Что предоставляет `<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, о котором цитировал Р. Мартиньо Фернандес, похоже, почти такой же].