Python 2.6.5支持Unicode吗?为什么listdir()不支持而Python 3.1.2支持?

4 投票
3 回答
2723 浏览
提问于 2025-04-16 00:31

有人说Python 2.6.5支持Unicode,那为什么在IDLE里用listdir()却不支持呢?而Python 3.1.2在IDLE里却能显示Unicode?(这是在Windows 7上测试的)

下面的代码表现是一样的:

for dirname, dirnames, filenames in os.walk('c:\path\somewhere'):
    for subdirname in dirnames:
        print (os.path.join(dirname, subdirname))
    for filename in filenames:
        print (os.path.join(dirname, filename))

更新:这里的Unicode是指文件名里的,而不是路径里的...

3 个回答

0

Python 2.x 支持 Unicode,但默认情况下不是 Unicode(在 3.x 中是默认的)。

在 Python 2.x 中,字符串默认是 8 位字节数组,所以当你在文件系统中工作时,会看到 UTF-8 编码的文件名。

而在 Python 3.x 中,所有字符串实际上默认都是 Unicode,所以 UTF-8 的解码是在输入输出的过程中进行的。

2

Python 3 默认把所有字符串都当作 Unicode,这可能就是它能直接使用的原因。

关于 listdir 的说明里提到:

在 2.3 版本中更改:在 Windows NT/2000/XP 和 Unix 系统上,如果 path 是一个 Unicode 对象,返回的结果将会是一个 Unicode 对象的列表。无法解码的文件名仍然会以字符串对象的形式返回。

所以我猜在 Python 2 中,你需要明确地把路径作为 Unicode 字符串来给,这样才能得到 Unicode 的结果。

5

Unicode字符串的写法在Python 2和Python 3之间发生了变化。你可以这样来指定一个Unicode字符串:

u'c:\\path\\somewhere'

如果你想使用Python 3的写法(在Python 3中,字符串默认就是Unicode,除非你加上b前缀),可以在你的文件顶部使用:

from __future__ import unicode_literals

撰写回答