【问题标题】:Encoding unicode path with filesystem encoding breaks it [duplicate]使用文件系统编码对 unicode 路径进行编码会破坏它[重复]
【发布时间】:2012-04-23 21:48:36
【问题描述】:

我在内存中确实有以下路径:

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)。

【问题讨论】:

  • Windows 使用 Unicode 路径。为什么要对 Unicode 字符串进行编码?
  • @André:它使用“Unicode”,而不是 Unicode。
  • 我现在在猜测,但是如果您将video_path 保留为 unicode 对象(不对其进行编码),将cmd = u'..' % videopath 也构造为 Unicode,然后在最后进行编码,会发生什么情况:@ 987654329@?在 Linux 和 Python 2.7 上没有区别,但在您的平台上可能值得一试。
  • 是一样的。问题是“mbcs”没有按应有的方式转换\xf5 字符,即使它是Windows XP 的默认系统编码(也可能是7)。这似乎是一个实现错误,但我不确定。

标签: python unicode mbcs


【解决方案1】:

来自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。与 获取命令行。因此 ctypes.windll.kernel32.CreateProcessW... 需要 使用。子流程模块可能应该对此进行修复 问题。

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

我的解决方案是将输入文件重命名为随机名称(使用支持 unicode 的 os.rename),使用 ffmpeg 转换,然后使用 subprocess.Popen 启动,然后将其重命名。

【讨论】:

    【解决方案2】:

    尝试使用 UTF-8 编码:

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

    【讨论】:

    • Windows 在其文件系统中不使用 UTF-8。
    【解决方案3】:

    除非我完全弄错了,否则中的双反斜杠

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

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

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

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

    【讨论】:

    • 我不知道为什么 stackoverflow 将其显示为两个斜杠 - 如果您查看代码,则有三个反斜杠。一个转义第一个反斜杠,第三个转义 unicode 字符。
    • @iTayb 有趣。但无论如何,一个反斜杠不应该足够吗?
    • @iTayb。啊对不起。不,我现在明白了。
    • @iTayb 我冒昧地编辑了这个问题。它现在使用逐字而不是块引用。至少现在可以正确显示反斜杠了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多