完全相同的代码,在 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 规范化形式引起的。
Technical Report #15 unicode.org 的定义了可用的形式,但 Apple 使用 HFS+ 的轻微变体,如记录 here .
因此,在一种情况下,您在 OS X/HFS+ 上有 NFD,在另一种情况下,您在 Linux 上有 NFC(如果您的文件系统编码是为 Linux 定义的,这并不总是例,请参阅 Wheeler 以了解您可能会发现的许多问题)。
因此,从根本上说,您无法避免这种行为,它的 native 文件系统可以做到这一点。
但如果您提出不同的要求,您可能会得到更令人满意的答案。您可以通过规范化为通用规范化形式等以有意义的方式比较名称,具体取决于您需要比较它们的原因。 Python 在 unicodedata
模块中使用 normalize()
函数提供规范化函数。
关于python - os.walk 返回不同编码的非 ascii (unicode) 文件名,如何处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36096934/