我不明白的是:为什么Python不会用upper()改写特殊字符?
'ô TRAM'.upper() != 'Ô TRAM'
'ô TRAM'.upper() == 'ô TRAM'
所有文本编辑器(包括vim
和emacs
)转换“O TRAM'.upper(),以 'O TRAM' 当我们问upcase。为什么Python似乎只能提升[a-zA-Z]个字符?解决方法是什么?
我不明白的是:为什么Python不会用upper()改写特殊字符?
'ô TRAM'.upper() != 'Ô TRAM'
'ô TRAM'.upper() == 'ô TRAM'
所有文本编辑器(包括vim
和emacs
)转换“O TRAM'.upper(),以 'O TRAM' 当我们问upcase。为什么Python似乎只能提升[a-zA-Z]个字符?解决方法是什么?
什么@Thanakon指出,简单是正确的:你可以在的Unicode做到这一点字符串。
你问过为什么尽管Python对“窄”字符串没有这样做。原因是:Unicode是一个真正的庞大的的东西 - 在内存和处理方面。这绝对不是微不足道的。看看Unicode的定义或ICU Library的实现。
当Python被构思出来时,早在90年代初,字符串的Unicode并不是一个大问题。对于Python社区向后兼容性一直是一个大问题。因此,在某些2.x版本中做“在窄字符串上进行unicode升级”会非常困难。
但是其他人在2000年代对这个解决方案并不满意,所以他们发明了新数据类型:unicode
。如果您将数据放在那里,您将获得完整的Unicode功能。还有其他模块,以方便您...
哦,顺便说一句:你显示的窄字符串必须是解释代码页之前它是有道理的unicode-ish。当你的字符串显示这里是许多编码解释一个(ISO-8859-1,也许?)
但现在的好东西:在的Python 3他们决定它的价值,打破向后兼容性。默认字符串是然后一个Unicode字符串!当你在Python 3中编写'hello'
时,它与Python 2 u'hello'
中的相同。并且你可以获得Unicode功能。
无论哪种方式,在Python 2 u'blah'
或Python 3 'blah'
你必须确保蟒蛇文件是保存在UTF-8(或类似)。在Python 3中,它是standard encoding的*.py
-files,在Python 2中,您必须包含文件编码的add an header-line# -*- coding: utf-8 -*-
,或者确保编辑器编写UTF-8 BOM mark。
在默认情况下使用Unicode的Python 3中,它应该可以工作。
在Python 2,你必须强迫它,这将这样的伎俩:
u'ô TRAM'.upper()
u
防止翻译成ASCII文本。 (其余为Unicode)
你标记你的问题作为unicode
,但你永远不使你的unicode字符串:
>>> print u'ô TRAM'.upper()
Ô TRAM
>>> print 'ô TRAM'.upper()
ô TRAM