Вау !! Я не могу поверить, что никто не ответил на это. Это супер отличный вопрос. Ты тоже почти все правильно понял. Мне нравится, что вы используете Unicode :: Collate :: Locale и Unicode :: GCString. Молодец!
Причина, по которой вы получаете «неправильный» вывод, заключается в том, что вы не используете метод columns
класса Unicode :: GCString для определения ширины печати материала, который вы печатаете.
printf
очень глупо и просто считает кодовые точки, а не столбцы, поэтому вы должны написать свою собственную функцию pad, которая учитывает столбцы GCS. Например, сделать это вручную, вместо того, чтобы писать это:
printf "%-10.10s", $gstring;
Вы должны написать это:
$colwidth = $gcstring->columns();
if ($colwidth > 10) {
print $gcstring->substr(0,10);
} else {
print " " x (10 - $colwidth);
print $gcstring;
}
Видите, как это работает?
Теперь нормализация не имеет значения. Не обращайте внимания на старый комментарий Керрека. Это очень неправильно. УЦА специально разработан таким образом, чтобы не допустить нормализации. Вы должны наклониться назад, чтобы ввернуть, чем вверх, например, передав normalization => undef
в конструктор на случай, если вы захотите использовать его метод gmatch
или что-то подобное.