2010-02-19 81 views
6

我看了其他ruby /编码相关的帖子,但一直未能弄清楚为什么以下不起作用。可能只是因为我很密集,但这是情况。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 
+0

您是否在脚本中使用编码魔术注释? – kch 2010-03-05 18:07:10

回答

0

也许txt.chomp.force_encoding( 'US-ASCII')+%(, “”, “”, “#{salesperson.force_encoding( '东西')}”)

+0

我沿着这些线路尝试过的一切都没有产生任何效果。我已经尝试将所有内容强制转换为US-ASCII,IBM437和UTF-8,但每次产生的字符串都是混合的,文件输入中包含16位字符,程序生成的数据中包含8位字符。有趣的是,如果我只是对控制台执行put操作,它将在文件输入中的每个字符之间显示一个空格,并且在附加数据上的数据之间没有空格。 – 2010-02-19 22:54:27

+2

我可能会尝试找到一个“小”可重现的测试用例,并对它进行ping红宝石核心。 – rogerdpack 2010-02-20 22:57:41

+0

在启动Ruby脚本之前,您也可以尝试使用'chcp'命令(例如'chcp 65001'将其设置为UTF-8)更改控制台中的活动代码页。不幸的是,你不能将它设置为UTF-16,这是我认为你的文件所在的位置。 – ewall 2010-04-21 20:39:29

0

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

您是否试过用.force_encoding(Encoding::UTF-16LE).force_encoding(Encoding::UTF-16BE)对附加数据进行编码?

1

与您的问题相关的一个小注释是您的csv数据为%(, "", "", "#{salesperson}")。这里你的双引号前有一个空格字符。如果在本文中有逗号,这可能会导致#{salesperson}被解释为多个字段。要解决这个问题,逗号和双引号之间不能有空格。例如:"this is a field","Last, First","and so on"。这是我创建报告时遇到的一个小问题,这些报告可以在Excel中查看。

Common Format and MIME Type for Comma-Separated Values (CSV) Files他们描述了一个csv文件的语法供参考。