我使用的是Mac OS X 10.8.2
当我尝试查找文件名包含非ASCII字符的文件时,虽然我确定它们已经存在,但我没有得到任何结果。以控制台输入
为例> find */Bärlauch*
我没有结果。但如果我尝试没有变形金刚,我会得到
> find */B*rlauch*
images/Bärlauch1.JPG
所以文件肯定存在。如果我用“ae”重命名文件替换“ä”,则找到该文件。
类似地,Python模块glob
无法找到文件:
>>> glob.glob('*/B*rlauch*')
['images/Bärlauch1.JPG']
>>> glob.glob('*/Bärlauch*')
[]
我发现它必须与编码有关但我的终端设置为utf-8而我使用的是使用unicode字符串的Python 3.3.0。
答案 0 :(得分:8)
Mac OS X在HFS +上使用非规范化字符始终作为文件名。使用unicodedata.normalize('NFD', pattern)
对glob模式进行非规范化。
import unicodedata
glob.glob(unicodedata.normalize('NFD', '*/Bärlauch*'))
答案 1 :(得分:1)
Python程序基本上是文本文件。传统上,人们只使用ASCII字符集中的字符来编写它们,因此不必考虑它们写入的编码:所有字符集都同意如何解码ASCII字符。
您使用非ASCII字符编写了一个Python程序。因此,您的程序带有隐式编码(您没有提到过):要保存这样的文件,您必须决定如何在磁盘上表示a-umlaut。我猜想也许你的编辑为你选择了非Unicode的东西。
无论如何,有两种方法可以解决这样的问题:要么限制自己只能在程序的源代码中使用ASCII字符,要么可以向Python声明要让它读取特定的文本文件编码
要执行前者,您应该将a-umlaut替换为其Unicode转义序列(我认为是\x0228
但目前无法测试)。要执行后者,您应该在文件顶部添加编码声明:
# -*- coding: <your encoding> -*-