Программно определить, занимает ли символ Unicode более одного символьного пространства в терминале - PullRequest
9 голосов
/ 17 августа 2011

Я обнаружил, что в терминале Mac OS X некоторые символы Юникода занимают более одного пробела.Например, 27FC (длинная стрелка вправо от бара).Он печатает два символа в ширину, но второй символ печатается поверх любого следующего символа, поэтому вы должны сделать ⟼<space> для правильной печати.Например, ⟼a печатает как.Arrow + a (я сделал размер шрифта большим, чтобы вы могли видеть его, но он делает это для всех размеров шрифта).

Кстати, это шрифт Menlo в приложении Mac OS X 10.6 Terminal.

23B3 (SUMMATION TOP) на самом деле печатает в виде двух символов шириной и в высоту (по крайней мере, в Safari, он делает это и в браузере, обратите внимание, как он перекрывается с приведенной выше строкой) ⎲

Однако в терминале в Ubuntu ни один из этих символов не печатается шире или выше одного символа.

Есть ли способ программно определить, занимает ли символ более одного пробела?

Я использую Python, поэтому что-то, что работает либо в чистом Python, либо в POSIX (т.е. яМожно было бы вызвать некоторую команду bash с использованием модуля os).

Кроме того, я должен отметить, что если я увеличу настройку «Интервал между символами» в настройках шрифта терминала до 1,5 (по умолчанию1.0), тогда это выглядит как Arrow + a spaced.

Также было бы неплохо, если бы ответ мог дать некоторое представление обо всем этом (то есть, почему это происходит?)

Ответы [ 3 ]

6 голосов
/ 17 августа 2011

Хотя это не относится к конкретным примерам, которые вы приводите (все они отображаются в Ubuntu для меня размером с один символ), символы CJK имеют свойство unicode, которое указывает, что они шире, чем обычно, и отображаются в двойном размере.ширина в некоторых терминалах.

Например, в python:

# 'a' is a normal (narrow) character
# '愛' can be interpreted as a double-width (wide) character
import unicodedata
assert unicodedata.east_asian_width('a') == 'N'
assert unicodedata.east_asian_width('愛') == 'W'

Кроме этого, я не думаю, что есть спецификация того, сколько места должны занимать определенные символы, кромеразмер глифа в любом шрифте, который вы используете (который ваш терминал, вероятно, игнорирует по причине, указанной Игнасио).

Для получения дополнительной информации о свойстве "восточная азиатская ширина" см. http://www.unicode.org/reports/tr11/

4 голосов
/ 17 августа 2011

Нет, поскольку невозможно определить, какой шрифт использует терминал. Всегда используйте моноширинный шрифт, усвоенный урок.

Это происходит потому, что терминал использует механизм разметки шрифтов «ячейка» (т.е. символы печатаются с определенными координатами X и Y независимо от их фактического размера), тогда как браузер использует механизм разметки шрифтов «поток» (печатаются последующие символы). где предыдущий символ закончился).

1 голос
/ 17 августа 2011

Это ошибка в терминале OS X.

Я бы не рекомендовал пытаться обойти это, потому что он сломается в других системах (например, Linux), и в конечном итоге может быть исправлен на Mac. Это также смущает любого, кто вставляет в другое приложение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...