Ruby: проверка ширины Восточной Азии (Юникод) - PullRequest
6 голосов
/ 13 января 2011

Используя Ruby, я должен выводить строки в столбчатом формате на терминал.Примерно так:

| row 1     | a string here     | etc
| row 2     | another string    | etc

Я могу сделать это нормально с латинскими символами UTF8, используя String # ljust и% s.

Но проблема возникает, когда символы корейские, китайские и т. Д.Столбцы просто не будут выравниваться, если есть строки английского языка, перемежающиеся со строками, содержащими корейский язык и т. Д.

Как я могу получить выравнивание столбцов здесь?Есть ли способ вывести азиатские символы в эквиваленте шрифта фиксированной ширины?Как насчет документов, которые должны отображаться и редактироваться в Vim?

Ответы [ 2 ]

3 голосов
/ 13 января 2011

Ваша проблема возникает с CJK (китайский / японский / корейский) полноразмерные и широкие символы (также прокрутите вниз для просмотра диаграмм);эти символы занимают две ячейки фиксированной ширины.String#ljust и друзья не принимают это во внимание.

В Python есть unicodedata.east_asian_width, который позволил бы вам написать свою собственную информацию о ширине, но это не так.Кажется, что существует в Ruby.Лучшее, что я смог найти - это сообщение в блоге: http://d.hatena.ne.jp/hush_puppy/20090227/1235740342 ( машинный перевод ).Если вы посмотрите на вывод в нижней части оригинала, он, кажется, делает то, что вы хотите, поэтому, возможно, вы можете повторно использовать часть кода Ruby.

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

  • | (вертикальная черта во всю ширину)
  • (пробел во всю ширину)
  • - (во всю ширину)dash; не отображается красиво в моем терминальном шрифте)
  • ー (еще один штрих во всю ширину)
1 голос
/ 11 декабря 2013

Поздно на вечеринке, но, надеюсь, все еще полезно: в Ruby вы можете использовать гем unicode-display_width , чтобы проверить восточную азиатскую ширину строки:

require 'unicode/display_width'
"⚀".display_width #=> 1
'一'.display_width #=> 2
...