[英]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
看看這里的問題和答案,我認為他們有一些有價值的線索。 具體來說,請注意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.