Mac OS X中文件系统的Unicode编码在Python中不正确吗?
在OS
X和Python中需要处理Unicode文件名。我稍后在代码中尝试使用文件名作为正则表达式的输入,但是文件名中使用的编码似乎与sys.getfilesystemencoding()告诉我的有所不同。采取以下代码:
#!/usr/bin/env python
# coding=utf-8
import sys,os
print sys.getfilesystemencoding()
p = u'/temp/s/'
s = u'åäö'
print 's', [ord(c) for c in s], s
s2 = s.encode(sys.getfilesystemencoding())
print 's2', [ord(c) for c in s2], s2
os.mkdir(p+s)
for d in os.listdir(p):
print 'dir', [ord(c) for c in d], d
它输出以下内容:
utf-8
s [229, 228, 246] åäö
s2 [195, 165, 195, 164, 195, 182] åäö
dir [97, 778, 97, 776, 111, 776] åäö
因此,文件系统编码为utf-8,但是当我使用utf-8对文件名åäö进行编码时,它将与使用相同字符串创建目录名不同。我希望当我使用字符串åäö创建目录并读回其名称时,它应该使用与我直接应用编码相同的代码。
如果我们看一下代码点97、778、97、776、111、776,它基本上是ASCII字符并带有变音符号,例如o
+¨=ö,这使它成为两个字符,而不是一个。我如何避免这种差异,Python中是否有与OS
X匹配的编码方案,为什么getfilesystemencoding()没有给我正确的结果?
还是我搞砸了?
-
MacOS X使用一种特殊的分解式UTF-8来存储文件名。如果您需要例如读入文件名并将其写入“正常” UTF-8文件,则必须将它们标准化:
filename = unicodedata.normalize('NFC', unicode(filename, 'utf-8')).encode('utf-8')
从这里开始:https :
//web.archive.org/web/20120423075412/http : //boodebr.org/main/python/all-about-python-and-
unicode