Mac OS X中文件系统的Unicode编码在Python中不正确吗?

发布于 2021-01-29 18:07:26

在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()没有给我正确的结果?

还是我搞砸了?

关注者
0
被浏览
42
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    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



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看