Проблема возникает из-за того, что actually фактически отображается в двух столбцах.В моей системе четыре смайлика и восемь цифр одинаково длинны:
????
12345678
Ожидается, что один широкий символ потребует два узких символа, чтобы перезаписать его.
Обработка этих смайликов как широкихрекомендуется Unicode TR51-16 :
В настоящее время для смайликов используется квадратное соотношение сторон, основанное на их происхождении на японском языке.Для совместимости рекомендуется продолжить эту практику с текущими и будущими смайликами.Как правило, они будут иметь примерно такое же вертикальное расположение и ширину продвижения, как и идеограммы CJK.
Учитывая рекомендацию, мне было бы удобно просто жестко кодировать что-либо в блоке Unicode "Emoticon" как широкое.Ваши другие символы, которые работают, такие как ? и ☞, не находятся в блоке смайликов (они в маджонге и различных символах соответственно).
Если вы хотите определить ширину во время выполнения, вы можете, например, задать Python, который сообщает о своей ширине в Восточной Азии как полную / широкую, даже если сами таблицы Unicode помечают ее как нейтральную:
$ python3 -c 'import sys; import unicodedata as u; print(u.east_asian_width(sys.argv[1]))' ?
W
$ python3 -c 'import sys; import unicodedata as u; print(u.east_asian_width(sys.argv[1]))' ♞
N
?? - это особый случай, так как он состоит из двух разных символов региональных индикаторов с отдельными кодовыми точками, но Python помечает каждый из них как нейтральный, поэтому, если вы возьмете это в 1, это все равно будет равно 2.