代码之家  ›  专栏  ›  技术社区  ›  Alex. S.

如何将Unicode转换为大写以打印它?

  •  37
  • Alex. S.  · 技术社区  · 16 年前

    我有这个:

    >>> print 'example'
    example
    >>> print 'exámple'
    exámple
    >>> print 'exámple'.upper()
    EXáMPLE
    

    我需要做的是打印:

    EXÁMPLE
    

    (a的重音是准确的,但大写)。

    我使用的是python 2.6。

    5 回复  |  直到 7 年前
        1
  •  58
  •   tylerl    16 年前

    我觉得这很简单 先转换成ASCII码。

     >>> print u'exámple'.upper()
     EXÁMPLE
    
        2
  •  18
  •   Jarret Hardie    16 年前

    在python 2.x中,只需在调用upper()之前将字符串转换为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格式。然后可以使用encode将其转换为其他格式,如utf-8。如果字符在,比如说,iso-8859-2(捷克语等,在本例中),您将使用 s.decode('iso-8859-2').upper() .

    在我的例子中,如果您的终端不符合unicode/utf-8标准,您所能期望的最好的方法是使用十六进制字符表示(如mine),或者使用 s.decode('utf-8').upper().encode('ascii', 'replace') ,哪个结果是“ex”?梅普尔如果不能使终端显示unicode,请将输出以utf-8格式写入文件,然后在最喜欢的编辑器中打开。

        3
  •  8
  •   flow    14 年前

    首先,现在我只使用Python3.1;它的主要优点是从Unicode对象中消除了字节字符串的歧义。这使得大多数文本操作比以前更安全。考虑到用户对python 2.x编码问题提出的数万亿个问题, u'äbc python 2.1的约定只是一个错误;带有明确的 bytes bytearray 生活变得容易多了。

    第二,如果PY3K不是你的口味,那么试着搭配 from __future__ import unicode_literals ,因为这将模仿py3k在python 2.6和2.7上的行为。这件事本可以避免你说的(容易犯的)错误。 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允许 上() 方法,但它仅在字节的US-ASCII解释中定义。因为utf-8使用值 在内部 8位 外部 对于us-ascii(128到255,US-ascii不使用),它们不会受到 上() 所以当我们在第二行解码时,我们得到的是小写 á . 最后,第三行是正确的,是的,令人惊讶的是,python似乎意识到 Á 大写字母是否与 γ . 我运行了一个快速测试来查看python 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 )
    

    仔细阅读这个列表可以发现很少有拉丁字母、西里尔字母或希腊字母出现;大部分输出是非欧洲字符和标点符号。我唯一能发现python搞错的字符是_¥/¥(\u0524、\u0525,'cyrillic capital small letter pe with downsor'),只要您不在拉丁扩展X块之外(查看这些,它们可能会产生意外),就可以实际使用该方法。当然,我没有检查映射的正确性。

    最后,这里是我在PY3K应用程序引导部分中所做的:一种重新定义编码的方法 sys.stdout 将数字字符引用(NCR)视为回退;这会导致打印到标准输出时永远不会引发Unicode编码错误。当我在Ubuntu工作时, _sys.stdout.encoding UTF-8 ;当同一个程序在Windows上运行时,它可能是类似于 cp850 . 输出可能看起来很标准,但应用程序运行时不会在这些笨重的终端上引发异常。

    #===========================================================================================================
    # 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 . 如果你只是 print x 在PY2中 X 是八进制字符串或Unicode对象。这是非常令人费解和容易造成很多头抓伤。如我所说,试着用将来导入的Unicode文字咒语至少移动到PY26。

    最后,引用一句话:“莱夫科维茨在他的文章中说得最好。 Encoding :

    我相信在这个背景下 讨论,术语“字符串”是 无意义的。有文本,还有 是面向字节的数据(可能 很好地表示文本,但还没有 已转换为它)。在python类型中, 文本为Unicode。数据是str.的想法 “非Unicode文本”只是 正在等待发生编程错误。“

    更新:刚刚发现python 3在大写时正确地将拉丁文小写字母long s转换为s。整洁!

        4
  •  4
  •   tylerl    16 年前

    我觉得这里缺少一些背景:

    >>> type('hello')
    <type 'str'>
    
    >>> type(u'hello')
    <type 'unicode'>
    

    只要您使用的是“unicode”字符串而不是“native”字符串,那么upper()之类的运算符就可以使用unicode进行操作。默认情况下,python 3使用unicode,这使得区别在很大程度上不相关。

    从中提取字符串 unicode str 然后回到 统一码 在许多方面都是次优的,如果需要,许多库将生成Unicode输出;因此请尝试仅使用 统一码 任何时候都可以在内部为字符串创建对象。

        5
  •  -1
  •   TukanF1    7 年前

    试试看:

    s = 'exámple'
    print unicode(s).upper()