unicode
  • console
  • printing
  • python-3.x
  • stdout
  • 2009-02-03 111 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尾隨空行不能被壓制。

    相關問題