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

时间:2013-08-08 22:50:36

标签: python macos unicode unicode-normalization hfs+

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

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

1 个答案:

答案 0 :(得分: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。