Ruby字符串编码问题

6
我查看了其他有关Ruby /编码的帖子,但无法弄清楚以下内容为什么不起作用。可能只是因为我太笨了,但以下是情况。
在Windows上使用Ruby 1.9。 我有一组CSV文件,需要在每行末尾附加一些数据。每当我运行我的脚本时,追加的字符都是乱码。输入文本似乎是IBM437编码,而我要附加的字符串起始为US-ASCII。就输入字符串或附加字符串强制编码而言,我尝试过的任何方法都似乎无法改变结果输出。我被难住了。当前的编码版本仅是我尝试过的最后一个版本。
def append_salesperson(txt, salesperson)
  if txt.length > 2
    return txt.chomp.force_encoding('US-ASCII') + %(, "", "", "#{salesperson}")
  end
end

salespeople = Hash[
    "fname", "Record Manager"]

outfile = File.open("ActData.csv", "w:US-ASCII")

salespeople.each do | filename, recordManager |
  infile = File.open("#{filename}.txt")
  infile.each do |line|
    outfile.puts append_salesperson(line, recordManager)
  end
  infile.close
end
outfile.close

1
你在你的脚本中使用编码魔法注释吗? - kch
3个回答

1
一个与你的问题相关的小提示是,你的csv数据如下:%(, "", "", "#{salesperson}")。在双引号之前有一个空格字符。如果这个文本中有逗号,那么#{salesperson}可能会被解释为多个字段。为了解决这个问题,逗号和双引号之间不能有空格。例如:"this is a field","Last, First","and so on"。当创建要在Excel中查看的报告时,我遇到了这个小问题。
逗号分隔值(CSV)文件的通用格式和MIME类型中,他们描述了csv文件的语法以供参考。

0

也许是 txt.chomp.force_encoding('US-ASCII') + %(, "", "", "#{salesperson.force_encoding('something')}")

?


我尝试过的所有相关方法都没有效果。我已经尝试将所有内容强制转换为US-ASCII、IBM437和UTF-8,但每次生成的字符串都是混合的,文件输入中有16位字符,程序生成的数据中有8位字符。有趣的是,如果我只是在控制台上做一个puts操作,它会在文件输入的每个字符之间显示一个空格,在附加数据中的数据之间不会有空格。 - John Prideaux
2
我可能会尝试找到一个“小”的可重现的测试案例,并向 Ruby 核心团队反馈。 - rogerdpack
你也可以尝试在启动 Ruby 脚本之前,通过控制台更改活动代码页,使用 chcp 命令(例如,chcp 65001 将其设置为 UTF-8)。不幸的是,你无法将其设置为 UTF-16,这可能是你的文件所在的编码。 - ewall

0

听起来CSV数据是以UTF-16的形式出现的...因此puts显示为可打印字符(第一个字节)加上空格(第二个字节)。

你试过用.force_encoding(Encoding::UTF-16LE)或者.force_encoding(Encoding::UTF-16BE)编码追加的数据吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接