4

我不明白:

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

当我们要求大写时,所有文本编辑器(包括vimemacs)都将 'ô TRAM'.upper() 转换为 'Ô TRAM'。为什么 Python 似乎只大写 [a-zA-Z] 字符?解决方法是什么?

4

3 回答 3

10

在默认使用 Unicode 的 Python 3 中,它应该可以工作。

在 Python 2 中,你必须强制它,这会成功:

u'ô TRAM'.upper()

u防止文本转换为 ASCII。(保留为 unicode)

于 2013-03-19T07:58:03.763 回答
4

@Thanakon 简要指出的是正确的:您可以在Unicode String上执行此操作。

不过,您确实问过为什么Python 不对“窄”字符串执行此操作。原因是:Unicode 是一个非常的东西——就内存和处理而言。这绝对不是小事。查看Unicode定义或ICU 库的实现。

早在 90 年代初,当 Python 被构思出来时,字符串上的 Unicode 还不是一个大问题。对于 Python 社区来说,向后兼容性一直是一个大问题。因此,在某些 2.x 版本中仅执行“窄字符串上的 unicode 大写”是非常困难的。

但是其他人在 2000 年代对这种解决方案并不满意,因此他们发明了一种新的数据类型unicode. 如果您将数据放在那里,您将获得成熟的 Unicode 功能。为了您的方便,还有其他模块......

哦,顺便说一句:您显示的窄字符串必须在代码页中解释,然后才能以 unicode-ish 大写它。正如您的字符串在此处显示的那样,它是许多编码解释之一(也许是 ISO-8859-1?)

但现在是好事:在Python 3中,他们认为打破向后兼容性是值得的。那么默认字符串一个 Unicode 字符串!当您'hello'在 Python 3 中编写时,这与在 Python 2 中相同u'hello'。在此之上,您将获得 Unicode 功能。

无论哪种方式,在 Python 2u'blah'或 Python 3'blah'中,您必须确保 python 文件以 UTF-8(或类似格式)保存。在 Python 3 中,它是 -files 的标准编码*.py,在 Python 2 中,您必须添加包含文件编码的标题行 # -*- coding: utf-8 -*-,或者确保您的编辑器写入UTF-8 BOM 标记

于 2013-03-19T08:40:30.427 回答
3

您将问题标记为unicode,但从未将字符串设为 unicode:

>>> print u'ô TRAM'.upper()
Ô TRAM
>>> print 'ô TRAM'.upper()
ô TRAM
于 2013-03-19T07:58:40.290 回答