我想在Windows 7中通过ruby(1.9.3)通过IO.popen对电影进行编码。 如果文件名仅包含ascii字符串,则编码正常进行。 但是使用unicode文件名时,脚本会返回“No such file or directory”错误。 喜欢以下代码。
#-*- encoding: utf-8 -*-
command = "ffmpeg -i ü.rm"
IO.popen(command){|pipe|
pipe.each{|line|
p line
}
}
我无法通过ffmpeg或ruby找到问题。 如何解决这个问题?
答案 0 :(得分: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
按照惯例,除非在特殊情况下,否则建议将do...end
用于多行代码块而不是{...}
。
<强>更新强>:
底层文件系统NTFS使用UTF-16进行文件名编码。所以가
是一个有效的文件名字符。但是,GBK无法编码가
,也不能编码日文Windows中的CP932。因此,您无法将该特定文件名发送到cmd.exe
,并且您不太可能使用IO.popen
处理该文件。对于CP932兼容的文件名,上面提供的编码方法可以正常工作。对于那些与CP932不兼容的文件名,最好将文件名修改为兼容的文件名。