新手问题 ruport 中文显示串行问题求助

bo6bear · 2015年02月07日 · 最后由 lyfi2003 回复于 2015年02月07日 · 1671 次阅读

大家好,我最近使用了 ruport 的向 console 打印表格的功能,给自己做一个复习时间表的小工具。但发现在显示中文的时候会出现串行的情况,大概看了一下 gem 中的源码。

def calculate_max_col_widths
  # allow override
  return if options.max_col_width

  options.max_col_width = []

  unless data.column_names.empty?
    data.column_names.each_index do |i|.
      options.max_col_width[i] = data.column_names[i].to_s.length # 里面基本对长度的判断都是使用length进行的,但中文的大小会占用二个字符长度在console中,就出现了以下说的问题。
    end
  end
  data.each { |r| max_col_widths_for_row(r) }.
end

下面是我的工具的主要代码部分,就是最简单的使用了 ruport 的例子。

def print_tab
  table = Ruport::Data::Table.new :column_names => ["宝贝","学习","复习1","复习2","复习3","复习4","复习5"],
    :data => @powers.map {|power|
    [power.name,
     power.first_study_time.strftime("%m-%d"),
     power.review1.strftime("%m-%d"),
     power.review2.strftime("%m-%d"),
     power.review3.strftime("%m-%d"),
     power.review4.strftime("%m-%d"),
     power.review5.strftime("%m-%d"),
    ]   
  }   
  puts table.to_text
end 

这是控制台显示的结果

我目前有二个不成熟的思路:

  1. 修改或覆盖一下源代码,但没有找到一个好的方式和方法,试了几下都不是很成功。再这么改下去,原 gem 就面目全非了。
  2. 是否能在 console 中把中文显示和英文的显示在字符上能对齐呢?(我之前在公司中有一个自研的工具把字段调节成 ‘宋体’ 就可以,但是我试了一下,还是不行。)而就算这个方法成功了,也只能点对点的解决我现在这台电脑上的问题。

这个问题断断续续困惑了我 2 天的时间,还请各位帮忙,多多指点,非常感谢大家。

如果你用的是 Ruby2.0 以上, 可以尝试手动改一下字串的计算方式如下:

str = '中文'

str.length
# result is 2

str.encode('gbk').force_encoding('ascii').length
# result is 4
需要 登录 后方可回复, 如果你还没有账号请 注册新账号