好吧,决定写出 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。