7

Mac 通常在规范化路径的 HFS+ 文件系统上运行。也就是说,如果您保存一个带有重音符号 é 的文件(u'\xe9'例如),然后执行 a os.listdir,您会看到文件名已转换为u'e\u0301'. 这是Pythonunicodedata模块可以处理的正常 unicode NFD 规范化。不幸的是,HFS+ 与 NFD 不完全一致,这意味着一些路径不会被规范化,例如福 ( u'\ufa1b') 不会改变,尽管它的 NFD 形式是u'\u798f'

那么,如何在 Python 中进行规范化呢?只要我可以从 Python 调用它们,我就可以使用本机 API。

4

1 回答 1

5

好吧,决定写出 Python 解决方案,因为我指出的其他相关问题更多的是 Objective-C。

首先你需要安装https://pypi.python.org/pypi/pyobjc-corehttps://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。

于 2013-08-09T21:37:09.683 回答