1

蟒蛇 2.7:

我正在尝试打开一个 mp3 以使用诱变剂读取其 ID3 标签(所以我宁愿不必更改方法),它调用:

file(filename, "rb")

对于没有特殊字符的文件,这很好用,但除此之外,我有时似乎得到

IOError: [Errno 2] No such file or directory: u"somepath\\08 - Muse - I Belong To You - Mon C\x9cur S'ouvre \xc0 Ta Voix.mp3"

而其他时候

u"somepath\\02 - Max\xefmo Park - Apply Some Pressure.mp3"

工作正常。

两者有什么区别?为什么一个有效而另一个无效?

干杯,

菲利克斯

编辑:它在 Eclipse 中的 pydev 下运行时工作,为此

sys.getdefaultencoding()

返回“Cp1252”,但不是从返回“ascii”的命令行返回。打印到 Eclipse 控制台时的文件名是

u"somepath\\08 - Muse - I Belong To You - Mon C\u0153ur S'ouvre \xc0 Ta Voix.mp3"

编辑:从 Winamp(音乐播放器)获取文件名的代码是:

winampProcess = win32api.OpenProcess(win32con.PROCESS_VM_READ, False, processID)
memoryBuffer = ctypes.create_string_buffer(256)
ctypes.windll.kernel32.ReadProcessMemory(winampProcess.handle, memoryPointer, memoryBuffer, 256, 0)
winampProcess.Close()
rawPath = win32api.GetFullPathName(memoryBuffer.raw.split("\x00")[0])
try:
    unicodeString = unicode(rawPath)
except UnicodeDecodeError:
    unicodeString = u""
    for char in rawPath:
        try:
            unicodeString += unicode(char)
        except UnicodeDecodeError as err:
            errStr = str(err)
            startIndex = errStr.index("0x")
            endIndex = errStr.index(" ", startIndex)
            hexStr = ""
            for i in range(startIndex, endIndex):
                hexStr += errStr[i]
            unicodeString += unichr(int(hexStr, 16))
return unicodeString

编辑:如果我明确设置,问题就解决了

unicode(str, "cp1252")

但我仍然不明白是什么导致了问题,这是一个 hacky 修复,可能不适用于其他狡猾的文件名......

4

2 回答 2

1

在目录上使用 os.listdir() 来查看文件名是什么,已编码。然后将其与执行 filename.encode('cp1252') 时得到的结果进行比较。应该有区别,这应该告诉你什么是错的。

我能想到的唯一真正的问题是某些东西被解码了两次。您也可能遇到标准化问题,但在这种情况下似乎不太可能。

于 2011-01-12T18:04:52.293 回答
1

只是猜测-您正在从一个程序中提取文件名,该程序使用当前默认编码中的多字节字符集,对于英文版的 Windows,它是 cp1252。Ascii 不包含任何扩展字符,这就是当您尝试使用 Ascii 编码将字符串编码为 Unicode 时出现错误的原因。

编辑:这个答案有一些关于在当前 Windows 代码页中编码文件名的信息。

于 2011-01-17T01:31:08.357 回答