簡體   English   中英

python 3.0,如何使print()輸出unicode?

[英]python 3.0, how to make print() output unicode?

我正在使用WinXP 5.1.2600,編寫一個涉及中文拼音的Python應用程序,這讓我遇到了無數的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]

請注意,ü= \\ xfc = 252沒有問題,因為它是高位ASCII。 但是ā= \\ u0101超過了8位。

任何人都知道如何將sys.stdout的編碼更改為'utf-8'? 請記住,如果我理解文檔正確,Python 3.0不再使用codecs模塊。


道歉,我給你的程序沒有序言。 在給出3行之前,它開始如下:

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

import sys

不幸的是,“coding:”行指定的編碼是源代碼的編碼 ,而不是控制台輸出的編碼。 但是謝謝你的想法!

Windows命令提示符(cmd.exe)無法顯示您正在使用的Unicode字符,即使Python在內部以正確的方式處理它。 您需要使用IDLE,Cygwin或其他可以正確顯示Unicode的程序。

有關完整說明,請參閱此主題: http//www.nabble.com/unable-to-print-Unicode-characters-in-Python-3-td21670662.html

您可能想嘗試將環境變量“PYTHONIOENCODING”更改為“utf_8”。 我已經在這個問題上寫了一篇關於我的考驗頁面

看看這里的問題和答案,我認為他們有一些有價值的線索。 具體來說,請注意sys模塊中的setdefaultencoding ,以及您可能不應該使用它的事實。

在Windows中以Python顯示Unicode字符的問題是已知的。 還沒有正式的解決方案。 正確的做法是使用winapi函數WriteConsoleW。 由於存在其他相關問題,因此構建工作解決方案並不重要。 但是,我已經開發了一個包,試圖修復Python關於這個問題。 請參閱https://github.com/Drekin/win-unicode-console 您還可以在那里閱讀有關該問題的更深入的解釋。 該軟件包也在pypi上( https://pypi.python.org/pypi/win_unicode_console ),可以使用pip安裝。

這是一個骯臟的黑客:

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

但是一切都打破了:

  • 簡單的靜音第一行已經打破了它:

     # doesn't work import os os.system("chcp 65001 >nul &") print("юникод") 
  • 檢查操作系統類型會破壞它:

     # 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尾隨空行無法抑制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM