python - str.title() 和 Mac 上的编码

标签 python python-3.x macos encoding

假设我有 3 个文件夹,分别名为“Grégory MM”、“Loïc RR”和“Danièle RR”(空格和重音字母)。

然后我使用以下代码获取仅首字母大写的所有名称:

import glob
names = [ x.title() for x in glob.glob('*') ]

如果文件夹是通过终端使用 mkdir 创建的,我会得到预期的结果:

>>> names
['Loïc Rr', 'Danièle Rr', 'Grégory Mm']

如果文件夹是从 Finder 创建的,我得到:

>>> names
['LoïC Rr', 'DanièLe Rr', 'GréGory Mm']

每个重音字母后的第一个字母大写。这是一种已知的行为吗?我怎样才能避免它?

Python 版本 3.7.0
系统:macOS Mojave 10.14.1
并且 sys.getfilesystemencoding() 返回 'utf-8'

最佳答案

这很可能与重音字母是否使用组合重音字符或单个重音代码点有关。我不知道您的系统上实际有什么文件名,但将名称以 NFC 形式(带有单重音代码点):

>>> x = 'Loïc Rr'
>>> unicodedata.normalize('NFC', x).title()
'Loïc Rr'

在 NFD 形式(结合重音字符)中,重音后没有大写:

>>> unicodedata.normalize('NFD', x).title()
'Loi\u0308C Rr'

我们得到了资本。

看起来title()认为组合字符标记了单词边界。 NFC 规范化可以有所帮助,但对于不存在专用代码点的怪异重音组合则无济于事。为了实现更强大的处理,您可能需要寻找比 Python 内置字符串方法更强大的 Unicode 处理库。

关于python - str.title() 和 Mac 上的编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53859788/

相关文章:

python - Fabric 密码

python - 将长数字转换为对应的字母组合

python - 数据结构;将元组列表转换为字典

c++ - 非阻塞套接字的 Windows select 和 Unix select 之间的区别

javascript - 是否可以在 Electron js 的 OS X 上启用非狮子式全屏?

python - 对列表理解中的词法闭包感到困惑

python - 从数据库层次结构中的 Django 父表获取数据

django - 如何使用 Django-Haystack 预先选择构面(即在页面加载时选中复选框)?

arrays - HackerRank 产品分布

ios - 用 macOS 模拟 iBeacon