2010-02-19 140 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文件的語法供參考。