<p>与您上一个问题相同:大多数Windows上的跨平台软件无法处理文件名中的非ASCII字符。在</p>
<p>Python的<code>subprocess</code>模块使用基于字节字符串的接口。在Windows下,命令行基于Unicode字符串(技术上是UTF-16代码单元),因此msc运行时使用编码(ANSI代码页)将字节字符串转换为Unicode字符串,这种编码方式因机器而异,永远不能包含所有Unicode字符。在</p>
<p>如果您的Windows安装是朝鲜语,则ANSI代码页将是949朝鲜语,您可以通过说出以下命令之一来编写命令:</p>
<pre><code>subprocess.call(command.encode('cp949'))
subprocess.call(command.encode('mbcs'))
</code></pre>
<p>(其中<code>mbcs</code>是“多字节字符集”的缩写,它是Windows上ANSI代码页的同义词。)如果您的安装不是朝鲜语,您将有一个不同的ANSI代码页,您将无法将该文件名写入命令,因为您的命令行编码中没有任何朝鲜文字母。ANSI编码从来没有像UTF-8那样有意义,因此没有人可以可靠地使用子进程来执行包含所有Unicode字符的命令。在</p>
<p>如前一个问题中所讨论的,Python为Unicode文件名提供了一些解决方法,可以使用本机win32api而不是C标准库。在python3中,它还使用win32unicode api来创建进程,但在python2中就不是这样了。通过<code>ctypes</code>调用Win32<code>CreateProcessW</code>命令,可以直接访问Windows api,但这有点麻烦。在</p>
<p>…而且无论如何也没有用,因为即使您在命令行中输入了非ANSI字符,<code>ffmpeg</code>命令本身也会失败。这是因为ffmpeg也是一个跨平台的应用程序,它使用C标准库来读取命令行和文件。它将无法读取命令行参数中的朝鲜语,即使您以某种方式完成了它也无法读取该名称的文件!在</p>
<p>这是Windows平台上持续不断的挫败感:尽管它内部支持Unicode非常好,但大多数运行在它上面的工具却不能。答案应该是Windows在它实现的所有字节字符串接口中都支持UTF-8,而不是没有人想要的糟糕的旧版ANSI代码页。不幸的是,微软一再拒绝采取任何第一步措施,使UTF-8成为Windows上的一流公民(即修复一些阻止UTF-8在控制台中工作的错误)。对不起的。在</p>
<p>无关:这个:</p>
^{pr2}$
<p>通常是个坏主意。文件名中有许多特殊字符会破坏命令行,并可能最终执行所有类型的其他命令。如果输入路径由不可信的人控制,这将是一个严重的安全漏洞。一般来说,当你把一个来自变量的命令行放在一起时,你需要应用转义来保证字符串的安全性,而Windows上的转义规则又复杂又烦人。在</p>
<p>通过将所有内容保留在Python中,可以避免转义问题和Unicode问题。不必启动命令来调用ffmpeg代码,您可以使用一个将ffmpeg的功能引入Python的模块,例如PyFFmpeg。在</p>
<p>或者一个廉价的解决方法是将文件复制/移动到Python中已知的安全名称,使用静态文件名运行<code>ffmpeg</code>命令,然后重命名/复制该文件。。。在</p>