Python 2.6.5支持Unicode吗?为什么listdir()不支持而Python 3.1.2支持?
有人说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
。