Ruby:检查东亚宽度(Unicode)

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

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

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

但是当字符是韩文,中文等时出现问题。当有英文行穿插包含韩文等的行时,列不会对齐。

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

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

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

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

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

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

  • |(全宽垂直条)
  • (全宽空间)
  • – (全角破折号;在我的终端字体中不能很好地渲染)
  • ー(另一个全宽划线)
Interesting Posts