Я сделал этот комментарий к вопросу:
Символы в «LIVE» Полная ширина символов.Хакерский способ справиться с ними может состоять в том, чтобы проверить их ширину с помощью unicodedata.east_asian_width(char)
(она будет возвращать «F» для символов полной ширины) и заменить конечным символом unicodedata.name(char)
(или просто считать их как длину 2)
Этот "ответ" по сути является другим комментарием, но слишком длинным для поля комментария.
Этот хак - как это реализовано в ответе Алдервена - почти работает для OP, но пример строки отображается с дополнительной половиной ширины символа (обратите внимание, что пример строки не содержит востокАзиатские символы полуширины.).
Я не могу воспроизвести это точное поведение, используя этот тестовый оператор, где s
- пример строки из вопроса, с различными удаленными символами:
print((s + (68 - (len(s) + sum(1 for x in s if ud.east_asian_width(x) in ('F', 'N', 'W')))) * 'x')+ '\n'+ ('x' * 68))
В интерпретаторе Python 3.6 в терминале Gnome в Debian, используя стандартный моноширинный шрифт по умолчанию, удаление символов полной ширины приводит к тому, что строка примера, по-видимому, отображает на три символа длиннее, чем эквивалентная строка символов "x".
Удаление символов полной ширины и ширины (ширина W в Восточной Азии) привело к появлению строки, длина которой соответствовала бы эквивалентному количеству символов "x".
В терминале Python 3.7 KDE Konsoleв OpenSuse, используя обычный шрифт Ubuntu Monospace, я не смог создать строку, отображающую то же самоедлина независимо от комбинации символов ширины, ширины или нейтральности («N»), которые я удалил.
Я заметил, что в блестках символ (seemed), казалось, занимал лишнюю половину ширины, когдаотображается отдельно в Konsole, но при тестировании полной строки не вижу разницы в половину ширины.
Я подозреваю, что проблема заключается в низкоуровневом рендеринге вне контроля Python, как это замечание по Unicode стандарт предлагает:
Примечание: Свойство East_Asian_Width не предназначено для использования современными эмуляторами терминала без соответствующей настройки в каждом конкретном случае.Такие эмуляторы терминала нуждаются в способе разрешения дихотомии половинной / полной ширины, которая необходима для таких сред, но свойство East_Asian_Width не обеспечивает готовое решение для всех ситуаций.Растущий репертуар стандарта Unicode уже давно выходит за рамки устаревших восточноазиатских кодировок символов, и часто приходится настраивать терминальные эмуляции для поддержки крайних случаев и изменений типографского поведения с течением времени.