Mac通常在HFS +文件系统上运行,该系统规范化路径。也就是说,如果您在其中保存带有重音é的文件(u'\xe9'
),然后执行os.listdir
,您将看到文件名已转换为u'e\u0301'
。这是the Python unicodedata
module可以处理的正常unicode NFD规范化。不幸的是,HFS +与NFD并不完全一致,这意味着某些路径不会被标准化,例如福(u'\ufa1b'
)将不会被更改,尽管其NFD格式为u'\u798f'
。
那么,如何在Python中进行规范化?只要我可以用Python调用它,我就可以使用原生API。
答案 0 :(得分:5)
好吧,决定写出Python解决方案,因为我指出的相关其他问题更多是Objective-C。
首先,您需要安装https://pypi.python.org/pypi/pyobjc-core和https://pypi.python.org/pypi/pyobjc-framework-Cocoa。然后应该工作:
import sys
from Foundation import NSString, NSAutoreleasePool
def fs_normalize(path):
_pool = NSAutoreleasePool.alloc().init()
normalized_path = NSString.fileSystemRepresentation(path)
upath = unicode(normalized_path, sys.getfilesystemencoding() or 'utf8')
return upath
if __name__ == '__main__':
e = u'\xe9'
j = u'\ufa1b'
e_expected = u'e\u0301'
assert fs_normalize(e) == e_expected
assert fs_normalize(j) == j
请注意,NSString.fileSystemRepresentation()似乎也接受str输入。在这种情况下我遇到了一些返回垃圾的情况,所以我认为将它与unicode一起使用会更安全。它总是返回str类型,因此您需要转换回unicode。