Я пытаюсь отформатировать некоторые строки в кодировке utf-8 в коде C (char *), используя функцию printf.Мне нужно указать длину в формате.Все идет хорошо, когда в строке параметров нет многобайтовых символов, но результат кажется неправильным, когда в данных есть несколько многобайтовых символов.
мой glibc довольно старый (2.17), поэтому я попыталсяс некоторыми онлайн-компиляторами и результат тот же.
#include <stdlib.h>
#include <locale.h>
int main(void)
{
setlocale( LC_CTYPE, "en_US.UTF-8" );
setlocale( LC_COLLATE, "en_US.UTF-8" );
printf( "'%-4.4s'\n", "elephant" );
printf( "'%-4.4s'\n", "éléphant" );
printf( "'%-20.20s'\n", "éléphant" );
return 0;
}
Result of execution is :
'elep'
'él�'
'éléphant '
Первая строка правильная (4 знака в выводе)
Вторая строка явно неверна (по крайней мере, с человеческой точки зрения)
Последняя строка также неверна: вместо 20
* 1011 записано только 18 символов Юникода * Кажется, что функция printf подсчитывает символы до декодирования UTF-8 (считая байты вместо символов Юникода)
Это ошибка в glibc или хорошо задокументированное ограничение printf?