Python 如何将path转换为Mac OS X path,这几乎是NFD的标准形式?

Python 如何将path转换为Mac OS X path,这几乎是NFD的标准形式?,python,macos,unicode,unicode-normalization,hfs+,Python,Macos,Unicode,Unicode Normalization,Hfs+,Mac通常在HFS+文件系统上运行,该文件系统规范化了路径。也就是说,如果您保存一个带有重音符号的文件(u'\xe9'),然后执行os.listdir,您将看到文件名已转换为u'e\u0301'。这是可以处理的正常unicode NFD规范化。不幸的是,HFS+与NFD并不完全一致,这意味着某些路径将不被规范化,例如福 (u'\ufa1b')将不会更改,尽管其NFD形式为u'\u798f' 那么,如何在Python中进行规范化呢?只要我能从Python调用本地API,我就可以使用它们。好吧,我决

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


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

好吧,我决定编写Python解决方案,因为我提到的另一个相关问题更客观——C

首先,您需要安装和安装。那么,以下几点应该起作用:

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。< /P>一个愚蠢的黑客应该工作:在一个临时目录中创建一个空文件并列出它。注意,当你可以通过一个代表深层目录结构的路径时,临时文件HACK变得非常昂贵。您需要执行os.makedirs并触摸文件,然后遍历目录结构以查看创建的内容。大概目录名和文件名之间的规范化是一致的,因此您可以拆分部分并仅为可能具有更改字符的部分创建文件,以避免遍历目录。但是,这显然不是一个很好的解决方案,它似乎实际上是的一个副本,并且似乎有我需要的答案:NSString fileSystemRepresentation。不确定是否应将其标记为“重复”或“删除”或什么。。。