В различных кодировках Unicode, например UTF-16le или UTF-8 , символ может занимать 2 или 3 байта. Многие приложения Unicode не заботятся о ширине отображения символов Unicode, так как они все латинские буквы. Например, в текстовом столбце 80 , который должен содержать 40 китайских символов или 80 латинских букв в одной строке, но большинство приложений (например, Eclipse, Notepad ++, и все известные текстовые редакторы, осмелюсь, если есть какое-то хорошее исключение), просто посчитайте каждый китайский символ как 1 ширину как латинскую букву. Это, безусловно, делает формат результата некрасивым и не выровненным.
Например, ширина табуляции, равная 8, приведет к следующему ужасному результату (считайте весь Юникод как 1 ширину экрана):
apple 10
banana 7
苹果 6
猕猴桃 31
pear 16
Однако ожидаемый формат (считать каждый китайский символ как 2 ширины):
apple 10
banana 7
苹果 6
猕猴桃 31
pear 16
Неправильный расчет ширины отображения символов делает эти редакторы совершенно бесполезными при выравнивании табуляции, переносе строк и переформатировании абзацев.
Хотя ширина символа может варьироваться в зависимости от шрифта, но во всех случаях терминального шрифта фиксированного размера китайский символ всегда имеет двойную ширину. То есть, несмотря на шрифт, каждый китайский символ предпочтительно отображать с шириной 2.
Одним из решений является то, что я могу получить правильную ширину, преобразовав кодировку в GB2312 , в кодировке GB2312 каждый китайский символ занимает 2 байта. однако некоторые символы Unicode не существуют в кодировке GB2312 (или GBK кодировка). И вообще, не очень хорошая идея вычислять ширину экрана из закодированного размера в байтах.
Просто вычислять все символы в Юникоде в диапазоне (\u0080
.. \uFFFF
) как 2 ширины также неверно, потому что в диапазоне также много символов шириной в 1 ширину.
Также сложно вычислить ширину отображения арабских и корейских букв, поскольку они строят слово / символ по произвольному количеству кодовых точек Unicode.
Таким образом, ширина отображения кодовой точки Unicode может быть не целым числом, я считаю, что это нормально, на практике они могут быть основаны на целых числах, по крайней мере лучше, чем ничего.
Итак, есть ли какой-либо атрибут, связанный с предпочтительной шириной отображения символа в стандарте Unicode?
Или какая-нибудь функция библиотеки Java для вычисления ширины экрана?