Curses - определенные эмодзи (флаги) деформируют вывод терминала

Ответ Roc - отличная помощь. Я хотел бы добавить к нему небольшой блок:

mRecyclerView.scrollToPosition(mAdapter.getItemCount() - 1);
0
задан Thomas Dickey 5 March 2019 в 00:09
поделиться

1 ответ

ncurses использует функцию операционной системы wcwidth для определения ширины символа. Terminal.app предполагает, что U + 1F1FA и U + 1F1F8 используют два столбца, в то время как wcwidth говорят, что они представляют собой только один столбец каждый. Зеленое сердце U + 1F49A рассматривается как wcwidth , так и Terminal.app как двойная ширина. Это можно увидеть, добавив символ до и после символа смайликов: там, где ncurses введен в заблуждение, в результате на экране отображаются перекрывающиеся символы.

illustration of overlap

До Unicode 9 (2016) все эти конкретные коды имеют «нейтральную ширину» в соответствии с файлом Unicode EastAsianWidth. Технический отчет Unicode # 11 Свойство символа Unicode «Ширина Восточной Азии» (с 1999 г.) подразумевает (никогда не дает четкого определения), что фактическая ширина символа «нейтральной ширины» зависит от контекста, т. Е. Если они используются вместе с символами двойной ширины, их следует рассматривать как символы двойной ширины. Например, он говорит

Узкие (и нейтральные) символы всегда отображаются на символы половинной ширины в наборе смешанной ширины

, но ссылаются на «смешанную ширину». «исключительно с точки зрения сочетания символов« полная ширина »(два столбца) и« ширина узкая »(один столбец).

Функция wcwidth обычно (MacOS, вероятно, не исключение) возвращает ту же ширину для данной кодовой точки, игнорируя настройки локали.

В Unicode 8 это соответствующие строки (диапазон значений):

1F1E6..1F1FF;N   # So    [26] REGIONAL INDICATOR SYMBOL LETTER A..REGIONAL INDICATOR SYMBOL LETTER Z
1F400..1F579;N   # So   [378] RAT..JOYSTICK

В Unicode 9 , U + 1F49A «заполнен» width ", но остальные два нейтральны:

1F1E6..1F1FF;N   # So    [26] REGIONAL INDICATOR SYMBOL LETTER A..REGIONAL INDICATOR SYMBOL LETTER Z
1F442..1F4FC;W   # So   [187] EAR..VIDEOCASSETTE

Я не вижу, чтобы они изменились впоследствии, через Unicode 12 (current).

Учитывая все это, это выглядит как ошибка в шрифте и / или wcwidth, которая передается по инерции (мало что вы можете с этим поделать, пока Apple не придет к созданию wcwidth согласен со своими шрифтами).

Кстати, вы можете найти Предложение по использованию ZERO WIDTH JOINER (ZWJ) между двумя символами региональных индикаторов , имеющее отношение к проблеме.

0
ответ дан Thomas Dickey 5 March 2019 в 00:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: