2013-04-15 29 views
0

我想在Windows 7中通過ruby(1.9.3)通過IO.popen編碼電影。 如果文件名僅包含ascii字符串,則編碼將正常進行。 但使用unicode文件名,腳本返回「沒有這樣的文件或目錄」錯誤。 像下面的代碼。使用Popen在Windows中使用Unicode文件名編碼電影

#-*- encoding: utf-8 -*- 
command = "ffmpeg -i ü.rm" 
IO.popen(command){|pipe| 
    pipe.each{|line| 
    p line 
    } 
} 

我找不到由ffmpeg或ruby引起的問題。 如何解決這個問題?

回答

0

Windows不使用UTF-8編碼。 Ruby直接將Unicode文件名的字節序列發送到文件系統,當然文件系統不會識別UTF-8序列。看來Ruby的新版本已經解決了這個問題。 (我不確定,我使用的是1.9.2p290,它仍然存在)。

您需要將UTF-8文件名轉換爲Windows使用的編碼。

# coding: utf-8 
code_page = "cp#{`chcp`.chomp[/\d+$/]}" # detect code page automatically. 
command = "ffmpeg -i ü.rm".encode(code_page) 
IO.popen(command) do |pipe| 
    pipe.each do |line| 
    p line 
    end 
end 

另一種方法是使用Windows使用的相同編碼保存腳本。並且不要忘記更新編碼聲明。例如,我使用的是簡體中國Windows和它使用GBK(CP936)作爲默認編碼:

# coding: GBK 
# save this file in GBK 
command = "ffmpeg -i ü.rm" 
IO.popen(command) do |pipe| 
    pipe.each do |line| 
    p line 
    end 
end 

BTW,按照慣例,建議使用do...end多行代碼塊,而不是{...},除非在特殊情況下。

UPDATE

底層文件系統NTFS使用UTF-16進行文件名的編碼。所以是一個有效的文件名字符。但是,GBK無法編碼,因此無法在日文版Windows中編碼CP932。所以你不能發送這個特定的文件名到你的cmd.exe,並且你不可能用IO.popen來處理那個文件。對於CP932兼容的文件名,上面提供的編碼方法工作正常。對於那些與CP932不兼容的文件名,最好將文件名修改爲兼容的文件名。

+0

謝謝你的回覆。但是我在日文窗口中使用日文,韓文和德文,有時候我會重命名一個像「あ가ü.avi」的文件。所以它一定是UTF8。而使用cmd.exe,我可以毫無問題地對文件進行編碼。 – Tetsu

+0

起初我得到了一個錯誤消息: 'code_page =「cp#{\'chcp \'.chomp [/ \ d + $ /]}'' 所以我直接設置代碼頁'code_page =」cp932「' ) 然後我得到了錯誤: 'encode':U + 00FC從UTF-8到Windows-31J +(Encoding :: UndefinedConversionError)' 根據wikipedia,GBK包含日文和韓文字符。 我想這就是爲什麼你可以無誤地運行這段代碼。 – Tetsu

+0

@Tetsu檢查更新,雖然沒有提供可行的解決方案,對不起 –

相關問題