UTF-8 Width Display Проблема китайских иероглифов

Когда я использую Perl или C для printfнекоторых данных, я пробовал их формат для управления шириной каждого столбца, например

printf("%-30s", str);

Но когда str содержит китайский символ, столбец не выравнивается должным образом. см. прикрепленную картинку.

Кодировка моего ubuntu - zh_CN.utf8, насколько я знаю, кодировка utf-8 имеет длину 1~4 байта. Китайский иероглиф имеет 3 байта.В моем тесте я обнаружил, что элемент управления форматом printf считает китайский символ равным 3, но на самом деле он отображается как ширина 2 ascii.

Таким образом, реальная ширина экрана не является константой, как ожидалось, а является переменной, связанной с количеством китайских символов, т. е.

Sw(x) = 1 * (w - 3x) + 2 * x = w - x

w — ожидаемое ограничение ширины, x — количество китайских символов, Sw(x) — это реальная ширина экрана.

Таким образом, чем больше китайских символов содержит строка, тем короче она отображается.

Как я могу получить то, что хочу? Считать китайские иероглифы перед printf?

Насколько я знаю, все китайские или даже все широкие символы, я думаю, отображаются как ширина 2, тогда почему printf считает их шириной 3? Кодировка UTF-8 не имеет ничего общего с длиной экрана.

5
задан tchrist 4 April 2015 в 18:17
поделиться