5

我在 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。

4

2 回答 2

8

Mac OS X总是对 HFS+ 上的文件名使用非规范化字符。用于unicodedata.normalize('NFD', pattern)非规范化 glob 模式。

import unicodedata

glob.glob(unicodedata.normalize('NFD', '*/Bärlauch*'))
于 2013-01-06T18:44:02.500 回答
1

Python 程序基本上是文本文件。传统上,人们只使用 ASCII 字符集中的字符来编写它们,因此不必考虑他们编写它们的编码:所有字符集都同意如何解码 ASCII 字符。

您已经使用非 ASCII 字符编写了 Python 程序。因此,您的程序带有隐式编码(您没有提到):要保存这样的文件,您必须决定如何在磁盘上表示变音符号。我猜想也许你的编辑为你选择了一些非 Unicode 的东西。

无论如何,有两种方法可以解决这个问题:要么你可以限制自己在程序的源代码中只使用 ASCII 字符,要么你可以向 Python 声明你希望它读取具有特定编码的文本文件。

要执行前者,您应该将 a-umlaut 替换为其 Unicode 转义序列(我认为这是\x0228但目前无法测试)。要执行后者,您应该在文件顶部添加一个编码声明:

# -*- coding: <your encoding> -*-
于 2013-01-06T18:21:59.800 回答