当前位置: 首页 > 面试题库 >

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

罗允晨
2023-03-14
问题内容

在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



 类似资料:
  • 我在Jenkins上设置编码属性时遇到了问题。 在master的test Jenkins“System Info”页面上显示和。相同的值显示在从服务器的“系统信息”页面上。slave配置中的字段不包括,但正如我所写的,系统信息中的编码是可以的。当我使用withMaven方法在从服务器上运行流水线脚本时,日志中有。 所有服务器,包括主服务器和从服务器,测试和生产,都是CentOS 8。在这两个环境中

  • 我在WSL中使用Ubuntu环境中的python编写了一个脚本。 我在Windows中下载了Firebase的私钥“ServiceAccountKey.json”,然后将其移动到我在WSL中的工作目录中。(使用'mv mnt/c/users/yiu/downloads/serviceaccountkey.json~/projects/scrape')。现在,我正试图将该文件传递给Certifica

  • Django所有地方都原生地支持Unicode数据。只要你的数据库能存储数据,你就可以安全地把Unicode字符串传递到模板、模型和数据库中。 本文档告诉你如果当你写用到非ASCII的数据或者模板的应用时,你需要知道什么。 创建数据库 确认你的数据库配置可以存储任意字符串数据。一般来讲,这意味着给它一个UTF-8或者UTF-16的编码方式。如果你用了更具约束性的编码 – 例如latin1 (iso

  • 问题内容: 每当我的Jenkins作业的构建完成时,我都会使用插件(也称为插件)发送包含结果的电子邮件。另外,如果系统中存在某个文件,则我正在修改消息的默认内容,以通知该文件的存在。 为此,我正在使用插件的字段。 __ 为运行准备环境 _ 属性内容 _ __ 建立阶段 _ 执行外壳 _ __ 构建后动作 _ 可编辑的电子邮件通知 _ 预发送脚本 执行构建时,将在中创建文件并填充它(我能够从Jenk

  • 我正在尝试阅读包含以下内容的pdf文件: 如果我打开它,它可以工作,但是如果我尝试使用编解码器.open(文件名,编码=“utf8”,mode=“rb”)来获取unicode字符串,我得到了以下异常: 您知道从此文件的内容中获取 unicode 字符串的方法吗? PS:我使用的是蟒蛇 2.7

  • 好的,正如标题所示,我的问题是正确地从python中的windows-1252编码文件中读取输入,并将所述输入插入SQLAlchemy MySql表。 当前系统设置: Windows 7虚拟机,带“罗杰访问控制系统”,输出文件 Ubuntu12.04 LTS虚拟机,带有Windows系统的共享文件夹,因此我可以使用“Python 2.7.3”访问该文件。 现在来看实际问题,对于输入文件,我有一个“