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调用它们.
好吧,决定写出Python解决方案,因为我指出的相关其他问题更多是Objective-C.
首先,您需要安装https://pypi.python.org/pypi/pyobjc-core和https://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.
| 归档时间: |
|
| 查看次数: |
750 次 |
| 最近记录: |