Как использовать новые типы char16_t и u8?

c11 улучшить поддержку кодирования со встроенными типами для utf-8, utf-16 и utf-32.

Однако мне совершенно не удалось найти ссылку на их использование в стандартных функциях. Все, что я нашел, это как использовать их в С++ 11, а не в C.

Итак, как напечатать, например, char32_t?


person user2284570    schedule 28.05.2015    source источник


Ответы (1)


Говорить особо нечего: в C11 представлены только четыре новые стандартные библиотечные функции для работы с char16_t и char32_t, которые преобразуют их в/из многобайтовых строк:

По отношению к printf() они ведут себя как типы uint_least16_t и uint_least32_t, поэтому вы можете использовать для них одни и те же спецификаторы формата:

#include <inttypes.h>

char32_t x = ...;
printf("%" PRIuLEAST32 "\n", x);

Если вы хотите напечатать значение как символ, вам нужно будет использовать приведенные выше функции преобразования.

Работа с char16_t и char32_t символьными и строковыми литералами идентична как в C11, так и в C++11.

person 一二三    schedule 29.05.2015
comment
Хорошо, вы имеете в виду, что эти новые типы должны быть преобразованы в другие типы, прежде чем отображаться как текст? Я также не согласен с тем, что char16_tповедение какuint_least16_tпосколькуchar16_t не имеет фиксированной разрядности. Разрядность зависит от ширины обрабатываемого символа Unicode. - person user2284570; 29.05.2015
comment
Да, если вам нужно напечатать символ, вам нужно будет преобразовать его в кодировку, ожидаемую вашим устройством вывода. Кроме того, §7.28 стандарта C11 определяет char16_t/char32_t с точки зрения uint_least16_t/uint_least32_t. Типы предназначены для представления единиц кода, которые имеют фиксированную ширину. - person 一二三; 29.05.2015
comment
Странно, потому что символ UTF-16 может быть длиннее 16 бит. - person user2284570; 29.05.2015
comment
Вы путаете кодовые единицы с кодировкой кодовой точки (для чего может потребоваться несколько кодовых единиц). - person 一二三; 30.05.2015