2011-08-19 39 views
1

這裏就是我的了:呼叫的iconv 1.8.7通過系統將文件從UTF-16轉換爲UTF-8

path_js = 'path/to/a/js/file.js' 
path_new_js = 'path/where/the/converted/file/should/go.js' 
puts('iconv -f utf-16le -t utf-8 ' + path_js + ' > ' + path_new_js) 
system('iconv -f utf-16le -t utf-8 ' + path_js + ' > ' + path_new_js) 

賣出期權聲明的輸出是:

iconv -f utf-16le -t utf-8 path/to/1-1-2_E1_MC105.js > compiled/path/to/1-1-2_E1_MC105.js 

如果我在終端中複製粘貼完全相同的行,則轉換將成功進行,但當它在我的ruby腳本中運行時,將使用與原始文件(本例中爲utf-16)相同的編碼創建新文件。關於什麼是缺失/錯誤的任何想法?

乾杯!

更新:我在Mac OS X雪豹,我試着使用紅寶石1.8.7(系統默認)和1.9.2(安裝使用RVM)相同的腳本。我也試過如下:

f = File.open(path_js,'rb') 
js = f.read 
f.close 
new_js = Iconv.conv('utf-8', 'utf-16', js) 
File.open(path_new_js,'w'){|f| f.write(new_js)} 

有了相同的結果:S

+0

你確定你應該說UTF-16LE嗎?這意味着文件中沒有BOM。如果搞砸了,輸出文件將與輸入文件有不同的數據。我敢打賭你應該使用UTF-16而不是UTF-16LE。幾乎從不指定LE或BE。 – tchrist

+0

如果我使用UTF-16而不是UTF-16LE,結果是一樣的。 –

+0

您應該使用UTF-16比UTF-16LE多獲得兩個字節:BOM是第一個,而不是第二個。 – tchrist

回答

0

這應該是直接運行該命令相同,所以一定它的實際運行正常。如果執行出現錯誤,system將返回false

您也可以使用Ruby中的iconv庫直接執行它,而不需要命令行工具。這可能提供更多的控制。

+0

系統正在恢復正常! :S –

+0

然後是給[iconv](http://www.ruby-doc.org/stdlib/libdoc/iconv/rdoc/index.html)一個鏡頭。 – tadman

+0

我做到了。看到我的問題更新。 –