2013-04-15 31 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检查更新,虽然没有提供可行的解决方案,对不起 –

相关问题