unicode
  • console
  • printing
  • python-3.x
  • stdout
  • 2009-02-03 75 views 18 likes 
    18

    我正在使用WinXP 5.1.2600,编写涉及中文拼音的Python应用程序,这涉及到无尽的Unicode问题。切换到Python 3.0已经解决了很多问题。但是出于某种奇怪的原因,控制台输出的print()函数不支持Unicode。这是一个小型项目。python 3.0,如何使print()输出unicode?

    print('sys.stdout encoding is "' + sys.stdout.encoding + '"') 
    str1 = 'lüelā' 
    print(str1) 
    

    的输出被(改变角括号方括号可读性):

     
        sys.stdout encoding is "cp1252" 
        Traceback (most recent call last): 
         File "TestPrintEncoding.py", line 22, in [module] 
         print(str1) 
         File "C:\Python30\lib\io.py", line 1491, in write 
         b = encoder.encode(s) 
         File "C:\Python30\lib\encodings\cp1252.py", line 19, in encode 
         return codecs.charmap_encode(input,self.errors,encoding_table)[0] 
        UnicodeEncodeError: 'charmap' codec can't encode character '\u0101' 
        in position 4: character maps to [undefined] 
    

    注意,U = \ XFC = 252给出没有问题,因为它是上ASCII。但是,ā= \ u0101超出了8位。

    任何人都有一个想法如何将sys.stdout的编码更改为'utf-8'?请记住,如果我理解文档权限,则Python 3.0不再使用codecs模块。


    道歉,我给你的程序没有前言。的3行给定之前,它开始这样的:

    #!/usr/bin/env python 
    # -*- coding: utf-8 -*- 
    
    import sys 
    

    不幸的是,由指定的编码“的编码:”行是源代码的编码,而不是的控制台输出。但是谢谢你的想法!

    回答

    15

    尽管Python在内部以正确的方式处理它,但Windows命令提示符(cmd.exe)无法显示正在使用的Unicode字符。您需要使用IDLE,Cygwin或其他可以正确显示Unicode的程序。

    看到这个线程更全面的解释: http://www.nabble.com/unable-to-print-Unicode-characters-in-Python-3-td21670662.html

    +7

    如果您使用可以显示所需Unicode字符的字体,并且将代码页更改为utf-8(可以使用:`CHCP 65001`),则cmd.exe可以显示Unicode字符 – smerlin 2011-03-23 16:03:35

    +0

    这不会确实可靠地工作......除了MSDN建议使用UTF-16,即所有Windows NT操作系统的本地编码。 – dom0 2012-05-18 07:48:49

    2

    检查出的问题和回答here,我觉得他们有一些有价值的线索。具体来说,请注意sys模块中的setdefaultencoding,但也是您可能不应该使用它的事实。

    11

    您可能想尝试将环境变量“PYTHONIOENCODING”更改为“utf_8”。我写了一个page on my ordeal with this problem

    1

    在Windows中显示Unicode字符的Python问题是已知的。目前尚无官方解决方案。正确的做法是使用winapi函数WriteConsoleW。因为还有其他相关问题,所以建立一个工作解决方案并不平凡。但是,我已经开发了一个包来解决这个问题。请参阅https://github.com/Drekin/win-unicode-console。您还可以阅读该问题的更深入的解释。该软件包也位于pypi(https://pypi.python.org/pypi/win_unicode_console)上,可以使用pip进行安装。

    1

    这里有一个肮脏的黑客:

    # works 
    import os 
    os.system("chcp 65001 &") 
    print("юникод") 
    

    然而一切打破它:

    • 简单静音第一线已经打破它:

      # doesn't work 
      import os 
      os.system("chcp 65001 >nul &") 
      print("юникод") 
      
    • 检查OS类型弄坏:

      # doesn't work 
      import os 
      if os.name == "nt": 
          os.system("chcp 65001 &") 
      
      print("юникод") 
      
    • 它甚至不工作,如果块下:

      # doesn't work 
      import os 
      if os.name == "nt": 
          os.system("chcp 65001 &") 
          print("юникод") 
      

    但可以用CMD的回声打印:

    # works 
    import os 
    os.system("chcp 65001 & echo {0}".format("юникод")) 
    

    这里有一个简单的方法,使这种跨 - 平台:

    # works 
    
    import os 
    
    def simple_cross_platrofm_print(obj): 
        if os.name == "nt": 
         os.system("chcp 65001 >nul & echo {0}".format(obj)) 
        else: 
         print(obj) 
    
    simple_cross_platrofm_print("юникод") 
    

    但是窗口的echo尾随空行不能被压制。

    相关问题