为什么Python的upper()不将特殊字符大写?

4 投票
3 回答
1133 浏览
提问于 2025-04-17 19:36

我不太明白这个:

'ô TRAM'.upper() != 'Ô TRAM'
'ô TRAM'.upper() == 'ô TRAM'

所有的文本编辑器(包括 vimemacs)在我们要求把文本变成大写时,都会把 'ô TRAM'.upper() 转换成 'Ô TRAM'。为什么 Python 似乎只把 [a-zA-Z] 的字母变成大写呢?有没有什么解决办法?

3 个回答

3

你在提问的时候标记了unicode,但是你并没有把你的字符串变成unicode格式:

>>> print u'ô TRAM'.upper()
Ô TRAM
>>> print 'ô TRAM'.upper()
ô TRAM
10

在Python 3中,默认使用的是Unicode,所以应该可以正常工作。

而在Python 2中,你需要手动设置一下,这样就可以了:

u'ô TRAM'.upper()

u这个前缀可以防止文本被转换成ASCII格式。(保持为unicode格式)

4

@Thanakon 简单提到的确是对的:你可以在Unicode 字符串上做到这一点。

不过你问了为什么 Python 在“窄”字符串上不这样做。原因是:Unicode 实在是个很庞大的东西——无论是从内存还是处理速度来看,这绝对不是小事。你可以看看 Unicode 的定义或者 ICU 库 的实现。

在 Python 诞生的时候,大约在90年代初,字符串的 Unicode 还不是个大问题。对于 Python 社区来说,向后兼容一直是个重要的考虑。因此,在某个 2.x 版本中,仅仅对“窄字符串进行 unicode 大写处理”是非常困难的。

但是到了2000年代,其他人对这个解决方案不满意,于是他们发明了一种新数据类型unicode。如果你把数据放在这里,你就能获得完整的 Unicode 功能。还有其他模块可以让你更方便使用...

哦,顺便说一下:你展示的窄字符串在进行 Unicode 大写处理之前,必须在一个代码页中解释,这样才有意义。你这里显示的字符串是众多编码解释中的一种(可能是 ISO-8859-1?)

但现在好消息来了:在Python 3中,他们决定打破向后兼容性。默认字符串就是 Unicode 字符串!当你在 Python 3 中写 'hello' 时,这和 Python 2 中的 u'hello' 是一样的。这样你就可以使用 Unicode 的功能了。

无论如何,在 Python 2 中使用 u'blah' 或者在 Python 3 中使用 'blah',你都必须确保 Python 文件保存为 UTF-8(或类似格式)。在 Python 3 中,这是 *.py 文件的标准编码,而在 Python 2 中,你需要添加一行头信息 # -*- coding: utf-8 -*- 来说明文件的编码,或者确保你的编辑器写入 UTF-8 BOM 标记

撰写回答