Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

  • | (вертикальная полоса полной ширины)
  • (пространство полной ширины)
  • - (Dash полная ширина; не хорошо раздается в моем терминальном шрифте)
  • ー (еще одна полная черта)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top