使用Popen在Windows中使用Unicode文件名编码电影

时间:2013-04-15 03:32:06

标签: ruby unicode ffmpeg popen

我想在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找到问题。 如何解决这个问题?

1 个答案:

答案 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不兼容的文件名,最好将文件名修改为兼容的文件名。