6

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

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

我可以使用 String#ljust 和 %s 处理拉丁 UTF8 字符。

但是当字符是韩文、中文等时就会出现问题。当英文行与包含韩文等的行穿插时,这些列根本不会对齐。

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

4

2 回答 2

3

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

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

或者如果你只打印全角字符(即你没有混合半角和全角),你可以偷懒,只使用全角形式的所有东西,包括间距和方框图。以下是您可以复制和粘贴的几个字符:

  • |(全角竖条)
  •   (全角空间)
  • -(全角破折号;在我的终端字体中没有很好地呈现)
  • ー(另一个全角破折号)
于 2011-01-13T19:22:42.890 回答
1

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

require 'unicode/display_width'
"⚀".display_width #=> 1
'一'.display_width #=> 2
于 2013-12-11T08:45:45.743 回答