Во-первых, подпись char
определяется реализацией . Кроме того, вы говорите printf()
напечатать номер со знаком, используя %d
. Чтобы переносить их в виде чисел без знака, необходимо привести их к unsigned
и распечатать, используя спецификатор формата %u
:
printf("%u ", (unsigned char) utfstring[i]);
Это позаботится об отрицательных числах, но у вас есть другая проблема: стандарт C не требует, чтобы компилятор принимал символы в кодировке UTF-8 в исходном коде. Только небольшой набор основных символов гарантируется стандартом. Возможно, вам придется проверить документацию для вашего конкретного компилятора и стандартной библиотеки, чтобы увидеть, как это обрабатывается. Вы можете получить UTF-8, некоторую другую кодировку или мусор; и что бы вы ни получили, это не портативно. Если это звучит неубедительно, вы правы, это так - C / C ++ давно играет в догонялки, когда дело доходит до i18n.
Хорошая новость в том, что дела налаживаются. Если ваш компилятор поддерживает C11, вы можете и должны использовать строковые литералы UTF-8 для переносимого кодирования кодовых точек UTF-8 в строках.