adr*_*ian 9 python unicode filenames path character-encoding
我真的希望我的Python应用程序在内部专门处理Unicode字符串.这对我来说最近很顺利,但我遇到了处理路径的问题.用于文件系统的POSIX API不是Unicode,因此文件可能(实际上有点常见)具有"不可解码"名称:文件系统未声明的文件名称.
在Python中,这表现为返回的对象unicode
和str
对象的混合os.listdir()
.
>>> os.listdir(u'/path/to/foo')
[u'bar', 'b\xe1z']
Run Code Online (Sandbox Code Playgroud)
在该示例中,字符'\xe1'
以Latin-1或某些形式编码,即使(假设的)文件系统报告sys.getfilesystemencoding() == 'UTF-8'
(在UTF-8中,该字符将是两个字节'\xc3\xa1'
).出于这个原因,UnicodeError
如果您尝试使用os.path.join()
Unicode路径,那么您将遍布整个地方,因为文件名无法解码.
在Python的Unicode指南提供有关Unicode路径名这样的建议:
请注意,在大多数情况下,应使用Unicode API.字节API只应用于可以存在不可解码文件名的系统,即Unix系统.
因为我主要关心Unix系统,这是否意味着我应该重构我的程序以仅处理路径的字节串?(如果是这样,我如何保持Windows兼容性?)或者还有其他更好的方法来处理不可解码的文件名吗?它们是否"非常稀有",我应该让用户重命名他们该死的文件?
(如果最好只在内部处理字节串,我有一个后续问题:如何在SQLite中为一列存储字节串,同时将其余数据保存为友好的Unicode字符串?)