Ruby:检查东亚宽度(Unicode)

时间:2011-01-13 15:53:18

标签: ruby vim fonts utf8-decode asianfonts

使用Ruby,我必须以列式格式输出字符串到终端。像这样:

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

使用String#ljust和%s,我可以使用拉丁文UTF8字符做得很好。

但是当字符是韩文,中文等时会出现问题。当英文行中散布着包含韩文等的行时,列就不会对齐。

如何在此处获得列对齐?有没有办法输出相当于固定宽度字体的亚洲字符?如何在Vim中显示和编辑文档?

2 个答案:

答案 0 :(得分:3)

您的问题发生在CJK(中文/日文/韩文)full-width and wide characters上(也向下滚动图表);这些字符占据两个固定宽度的单元格。 String#ljust和朋友们不考虑这一点。

Python中有unicodedata.east_asian_width,它允许你编写自己的宽度感知ljust,但它似乎不存在于Ruby中。我能找到的最好的是这篇博文:http://d.hatena.ne.jp/hush_puppy/20090227/1235740342machine translation)。如果你查看原始底部的输出,它似乎可以做你想要的,所以也许你可以重用一些Ruby代码。

或者如果你只是打印全角字符(即你没有混合半宽和全宽),你可能会很懒,只需使用全宽形式的所有内容,包括间距和方框画画。这里有几个你可以复制和粘贴的字符:

  • |(全角垂直条)
  • (全宽空间)
  • - (全角划线;不能在我的终端字体中很好地呈现)
  • ー(另一个全角划线)

答案 1 :(得分:1)

晚会,但希望仍然有用:在Ruby中,您可以使用unicode-display_width gem来检查字符串的东亚宽度:

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