如何将路径转换为Mac OS X路径,几乎是NFD正常形式?

Hei*_*nen 7 python unicode macos hfs+ unicode-normalization

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

那么,如何在Python中进行规范化呢?我可以使用原生API,只要我可以用Python调用它们.

Hei*_*nen 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
Run Code Online (Sandbox Code Playgroud)

请注意,NSString.fileSystemRepresentation()似乎也接受str输入.在这种情况下我遇到了一些返回垃圾的情况,所以我认为将它与unicode一起使用会更安全.它总是返回str类型,因此您需要转换回unicode.