Ruby 使用Popen在Windows中使用Unicode文件名对电影进行编码

Ruby 使用Popen在Windows中使用Unicode文件名对电影进行编码,ruby,unicode,ffmpeg,popen,Ruby,Unicode,Ffmpeg,Popen,我想在Windows7中通过ruby(1.9.3)的IO.popen对电影进行编码。 如果文件名仅包含ascii字符串,则编码将正常进行。 但对于unicode文件名,脚本返回“无此类文件或目录”错误。 就像下面的代码一样 #-*- encoding: utf-8 -*- command = "ffmpeg -i ü.rm" IO.popen(command){|pipe| pipe.each{|line| p line } } 我无法确定问题是由ffmpeg还是ruby引起的

我想在Windows7中通过ruby(1.9.3)的IO.popen对电影进行编码。 如果文件名仅包含ascii字符串,则编码将正常进行。 但对于unicode文件名,脚本返回“无此类文件或目录”错误。 就像下面的代码一样

#-*- encoding: utf-8 -*-
command = "ffmpeg -i ü.rm"
IO.popen(command){|pipe|
  pipe.each{|line|
    p line
  }
}
我无法确定问题是由ffmpeg还是ruby引起的。
如何解决此问题?

Windows不使用UTF-8编码。Ruby将Unicode文件名的字节序列直接发送到文件系统,当然文件系统不会识别UTF-8序列。似乎更新版本的Ruby已经解决了这个问题。(我不确定。我正在使用1.9.2p290,但它仍然存在。)

您需要将UTF-8文件名转换为Windows使用的编码

#编码:utf-8
code_page=“cp{`chcp`.chomp[/\d+$/]}”#自动检测代码页。
command=“ffmpeg-iü.rm”。编码(代码页)
IO.popen(命令)do |管道|
管道。每个do |线|
p线
结束
结束
另一种方法是使用Windows使用的相同编码保存脚本。别忘了更新编码声明。例如,我使用简体中文窗口,它使用GBK(CP936)作为默认编码:

#编码:GBK
#用GBK保存此文件
command=“ffmpeg-iü.rm”
IO.popen(命令)do |管道|
管道。每个do |线|
p线
结束
结束
顺便说一句,根据惯例,建议对多行代码块使用
do…end
,而不是
{…}
,除非在特殊情况下

更新


底层文件系统NTFS使用UTF-16进行文件名编码。所以
是有效的文件名字符。但是,GBK无法编码
,以便在日文窗口中使用CP932。因此,您无法将该特定文件名发送到
cmd.exe
,并且不太可能使用
IO.popen
处理该文件。对于CP932兼容的文件名,上面提供的编码方法可以很好地工作。对于那些与CP932不兼容的文件名,最好将您的文件名修改为兼容的文件名。

谢谢您的回复。但我在日文窗口中使用日文、韩文和德文,有时我会将文件重命名为“あ가u.avi”。所以它一定是UTF8。使用cmd.exe,我可以毫无问题地对文件进行编码。首先,我得到了一个错误消息:
code\U page=“cp”{`chcp`.chomp[/\d+$/]}
,所以我直接设置了代码页
code\U page=“cp932”
(我通过cmd.exe检查过)。然后我得到了错误:
encode]:U+00FC从UTF-8到Windows-31J+(编码::UnfinedConversonError)
根据维基百科,GBK包括日语和韩语字符。我想这就是为什么你可以毫无错误地运行这段代码的原因。@Tetsu检查更新,尽管没有提供可行的解决方案,抱歉,无论如何谢谢!我现在知道在windows中不可能正确发送unicode文件名。:)