在Mac OsX和CentOS 7上运行的代码完全相同,返回的结果不同:
>>> path = u'examples'
>>> import os
>>> walker = os.walk(path, followlinks=True)
>>> list(walker)
在CentOS上:
[u'filename-with-un\xec\u010d\xf8\u0111e-chars.txt', ... ]
在MacOSX上:
[u'filename-with-uni\u0300c\u030c\xf8\u0111e-chars.txt', ... ]
顺便说一句,实际的文件名是 filename-with-unìčøđe-chars.txt
是什么导致了这种行为,我们如何避免呢?
此行为是由OS X和Cent OS上文件名的不同Unicode规范化形式引起的。
unicode.org的技术报告#15定义了可用的表格,但是Apple对HFS +使用了一些细微的变体,如此处所述。
因此,在一种情况下,您在OS X / HFS +上具有NFD,在另一种情况下,您具有用于Linux的NFC(如果很高兴您的文件系统编码完全是针对Linux定义的,但并非总是如此,请参阅惠勒(Wheeler)解决了您可能会发现的许多问题)。
因此,从根本上讲,您无法避免这种行为,即这样做的本机文件系统。
但是,如果您提出不同的要求,则可能会得到更令人满意的答案。您可以通过有意义的方式比较名称,方法是将其标准化为通用的标准化形式等,具体取决于您为什么需要比较它们。Python在unicodedata
模块中提供具有该normalize()
功能的规范化功能。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句