关于python:如何将路径转换为几乎是NFD正常格式的Mac OS X路径?

How to convert path to Mac OS X path, the almost-NFD normal form?

Mac通常在可标准化路径的HFS文件系统上运行。也就是说,如果您保存带有重音符号??的文件,例如在其中(u'\\xe9'),然后执行os.listdir,您将看到文件名已转换为u'e\\u0301'。这是Python unicodedata模块可以处理的普通unicode NFD标准化。不幸的是,HFS与NFD并不完全一致,这意味着某些路径将无法标准化,例如?|?。尽管(u'\\ufa1b')的NFD格式为u'\\u798f'

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


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

首先,您需要安装https://pypi.python.org/pypi/pyobjc-core和https://pypi.python.org/pypi/pyobjc-framework-Cocoa。然后以下应该工作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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。