完全相同的代码,在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', ... ]
BTW,实际文件名为filename-with-unìčøđe-chars.txt
导致此行为的原因是什么,我们如何避免这种行为?
答案 0 :(得分:1)
该行为是由OS X和Cent OS上的文件名的不同unicode规范化表单引起的。
unicode.org的Technical Report #15定义了可用的表单,但Apple对HFS +使用了一个略有变体的文档here。
因此,在一个案例中,你在OS X / HFS +上有NFD,而在另一个案例中你有适用于Linux的NFC(如果你很高兴你的文件系统编码完全是为Linux定义的,那并不总是如果您遇到很多问题,请参阅Wheeler。
所以,从根本上说,你无法避免这种行为,它的本机文件系统就是这样做的。
但如果你提出不同的答案,你可能会得到一个更令人满意的答案。您可以通过标准化到常规规范化形式等以有意义的方式比较名称,具体取决于您需要比较它们的原因。 Python使用unicodedata
函数在normalize()
模块中提供规范化函数。