我有这样的:

>>> 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约定只是一个错误;具有明确bytesbytearray,生活变得容易得多。

其次,如果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.encodingutf-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 xx或者是一个字节串或一个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()
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top