我怎样才能Unicode转换为大写打印呢?
-
05-09-2019 - |
题
我有这样的:
>>> print 'example'
example
>>> print 'exámple'
exámple
>>> print 'exámple'.upper()
EXáMPLE
我需要做的打印:
EXÁMPLE
(这里的 'a' 获得其accute口音,但在大写。)
我使用Python 2.6。
解决方案
我认为这是作为的不强>转换第一至ASCII。
作为简单 >>> print u'exámple'.upper()
EXÁMPLE
其他提示
在蟒2.x的,只是转换调用上之前为Unicode字符串()。使用您的代码,这是UTF-8格式本网页:
>>> s = 'exámple'
>>> s
'ex\xc3\xa1mple' # my terminal is not utf8. c3a1 is the UTF-8 hex for á
>>> s.decode('utf-8').upper()
u'EX\xc1MPLE' # c1 is the utf-16 aka unicode for á
要decode
采取它从当前格式为Unicode的呼叫。然后,您可以将其转换为其他格式,如UTF-8,使用编码。如果字符是,说,ISO-8859-2(捷克等,在这种情况下),你会改用s.decode('iso-8859-2').upper()
。
由于在我的情况,如果你的终端不兼容的Unicode / UTF-8,你可以期望的最好的是无论是字符的十六进制表示(像我),或有损地使用s.decode('utf-8').upper().encode('ascii', 'replace')
,这会导致将其转换“ EX?MPLE”。如果你不能让你的终端显示unicode的,写在UTF-8格式输出到一个文件,并打开,在你喜欢的编辑器。
首先,我只使用Python 3.1这些天;其核心意义在于具有Unicode对象消除歧义的字节串。这使得绝大多数的文本操作的要比过去的情况要安全得多。在用户问题关于蟒蛇2.x的编码问题万亿称重,蟒蛇2.1 u'äbc
约定只是一个错误;具有明确bytes
和bytearray
,生活变得容易得多。
其次,如果py3k是不是你的口味,然后尝试去from __future__ import unicode_literals
,因为这会模仿Python的2.6和2.7 py3k的行为。这件事情本来可以避免的(容易犯)跌跌撞撞说print 'exámple'.upper()
你这么做的时候。本质上,这是相同py3k:print( 'exámple'.encode( 'utf-8' ).upper() )
。比较这些版本(py3k):
print( 'exámple'.encode( 'utf-8' ).upper() )
print( 'exámple'.encode( 'utf-8' ).upper().decode( 'utf-8' ) )
print( 'exámple'.upper() )
第一个是,基本上,你做了什么用裸字符串'exámple'
的时候,只要你设置你的默认编码utf-8
(根据BDFL宣告,在运行时设置的默认编码是一个坏主意,所以在PY2你必须说import sys; reload( sys ); sys.setdefaultencoding( 'utf-8' )
欺骗它,我提出一个更好的解决方案为py3k下文)。当你看这三行的输出:
b'EX\xc3\xa1MPLE'
EXáMPLE
EXÁMPLE
您可以看到,当upper()
得到了适用于第一个文本,它作用于字节,而不是字符。 Python允许对字节upper()
方法,但它仅是在字节的US-ASCII解释定义。因为UTF-8使用值内 8位,但 US-ASCII(128到255,其不使用US-ASCII)以外,那些将不会被受upper()
,所以当我们在第二行解码回来了,我们得到了小写á
。最后,第三行则是正确的,是的,惊讶的是,蟒蛇似乎意识到Á
是对应于á
大写字母。我跑的快速测试,以查看什么字符蟒3不大写和小写之间进行转换:
for cid in range( 3000 ):
my_chr = chr( cid )
if my_chr == my_chr.upper() and my_chr == my_chr.lower():
say( my_chr )
细读列表揭示的拉丁,西里尔,或希腊字母很少发生率;大部分输出的非欧洲字符和标点符号。唯一的字符我能找到的蟒蛇得到了错误的Ԥ/ԥ(\ u0524 \ u0525,“西里尔{资本|小}与伸字母PE”),所以只要你留在拉丁文扩展-X块之外(看看这些,他们可能会产生意外),你实际上可能会使用该方法。当然,我没有检查映射的正确性。
最后,这里是我把我的py3k应用引导部分:重新定义编码sys.stdout
看到的方法,用数值字符引用(NCR的)作为后备;这具有打印到标准输出绝不会提出一个unicode编码错误的影响。当我在Ubuntu的工作,_sys.stdout.encoding
是utf-8
;当同样的程序在Windows上运行,它可能是古朴像cp850
。输出可能看起来starnge,但应用程序而对那些愚笨端子产生异常运行。
#===========================================================================================================
# MAKE STDOUT BEHAVE IN A FAILSAFE MANNER
#-----------------------------------------------------------------------------------------------------------
def _harden_stdout():
"""Ensure that unprintable output to STDOUT does not cause encoding errors; use XML character references
so any kind of output gets a chance to render in a decipherable way."""
global _sys_TRM
_sys.stdout = _sys_TRM = _sys_io.TextIOWrapper(
_sys.stdout.buffer,
encoding = _sys.stdout.encoding,
errors = 'xmlcharrefreplace',
line_buffering = true )
#...........................................................................................................
_harden_stdout()
多一个忠告:测试时,总是试图print repr( x )
或揭示x
的身份类似的事情。种种误解可以突然出现,如果你只是在PY2 print x
和x
或者是一个字节串或一个unicode对象。它很不解,容易造成大量的头划伤的。正如我所说的,尝试移动至少与从未来进口的Unicode文本咒语py26。
和关闭,引用了一句名言:“莱夫科维茨雕文在他的文章编码最好说, :
相信在这样的背景下 讨论中,“串”一词 无意义的。有文字,有 为B面向YTE数据(其可以非常 还有代表文本,但尚未 转换到它)。在Python类型, 文字是unicode。数据是海峡。这个想法 “非Unicode文本”只是一个 编程错误等待发生。“
更新:刚发现蟒3正确地转换uppercasing当s拉丁小写字母LONG s到S上。整齐!
我觉得有一点背景我们在这里失踪的:
>>> type('hello')
<type 'str'>
>>> type(u'hello')
<type 'unicode'>
只要你使用“统一”的字符串,而不是“本土”的字符串,像上)的运营商(将在考虑统一操作。 FWIW,Python 3中默认使用的unicode,使得区别很大程度上不相关的。
以从unicode
一个字符串str
然后回到unicode
是次优的方法很多,如果你想它的许多图书馆将产生的unicode输出;所以要尽量时,您可以在内部使用仅unicode
对象的字符串。
尝试:
s = 'exámple'
print unicode(s).upper()