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不兼容的文件名,最好将文件名修改为兼容的文件名。
谢谢你的回复。但是我在日文窗口中使用日文,韩文和德文,有时候我会重命名一个像“あ가ü.avi”的文件。所以它一定是UTF8。而使用cmd.exe,我可以毫无问题地对文件进行编码。 – Tetsu
起初我得到了一个错误消息: 'code_page =“cp#{\'chcp \'.chomp [/ \ d + $ /]}'' 所以我直接设置代码页'code_page =”cp932“' ) 然后我得到了错误: 'encode':U + 00FC从UTF-8到Windows-31J +(Encoding :: UndefinedConversionError)' 根据wikipedia,GBK包含日文和韩文字符。 我想这就是为什么你可以无误地运行这段代码。 – Tetsu
@Tetsu检查更新,虽然没有提供可行的解决方案,对不起 –