使用文件系统编码对unicode路径进行编码会破坏它

时间:2012-04-23 21:48:37

标签: python unicode mbcs

我在内存中有以下路径:

video_path = u'C:\\Documents and Settings\\user\\My Documents\\Downloads\\\xf5iv - Neon Phoenix [Free DL].mp3'

我正在尝试将其用作cmd中的参数,因此我必须对其进行编码。

video_path = video_path.encode(sys.getfilesystemencoding())
cmd = 'ffmpeg -y -i "%s" -vn -ac 2 -f mp3 audio.mp3' % video_path
subprocess.Popen(cmd)

但是字符串没有以正确的方式编码 - 它将\xf5转换为?而不是õ。因此无法找到该文件。

这怎么可能发生?我正在使用默认文件系统编码(即mbcs)。

3 个答案:

答案 0 :(得分:2)

回答here

  

在Py3K中 - 至少来自“Python”3.2 - subprocess.Popen和sys.argv   在Windows上与(默认的unicode)str一致。   显然使用CreateProcessW和GetCommandLineW。

     

在Python中 - 至少达到v2.7.2 - subprocess.Popen是错误的   unicode参数。它坚持CreateProcessA(而os。*是   与unicode一致)。并且shlex.split会产生额外的废话。   Pywin32的win32process.CreateProcess也不会自动切换到W   版本,也没有win32process.CreateProcessW。与...相同   GetCommandLine。因此ctypes.windll.kernel32.CreateProcessW ...需要   使用。或许应该修复子过程模块   问题。

因此,subprocess.Popen无法在Python 2.x版本中处理unicode。

我的解决方案是将输入文件重命名为随机(os.rename,支持unicode),使用ffmpeg进行转换,然后将其重命名为<{1}}。< / p>

答案 1 :(得分:0)

尝试使用UTF-8进行编码:

video_path = video_path.encode("utf-8")

答案 2 :(得分:0)

除非我完全弄错,否则双击反斜率

video_path = u'C:...\\xf5iv...'

导致问题。应该只有一个:

video_path = u'C:...\xf5iv...'

否则,反斜杠将保留为反斜杠,并留给os.system()而不是.encode()来处理。