为什么Python在默认编码为ASCII时会打印unicode字符?

时间:2010-04-08 00:03:09

标签: python unicode encoding ascii python-2.x

从Python 2.6 shell:

>>> import sys
>>> print sys.getdefaultencoding()
ascii
>>> print u'\xe9'
é
>>> 

我希望在print语句之后有一些乱码或错误,因为“é”字符不是ASCII的一部分,我没有指定编码。我想我不明白ASCII是默认编码的意思。

修改

I moved the edit to the Answers section and accepted it as suggested.

5 个答案:

答案 0 :(得分:25)

当将Unicode字符打印到stdout时,使用sys.stdout.encoding。假定非Unicode字符位于sys.stdout.encoding中,并且仅发送到终端。在我的系统上(Python 2):

>>> import unicodedata as ud
>>> import sys
>>> sys.stdout.encoding
'cp437'
>>> ud.name(u'\xe9') # U+00E9 Unicode codepoint
'LATIN SMALL LETTER E WITH ACUTE'
>>> ud.name('\xe9'.decode('cp437')) 
'GREEK CAPITAL LETTER THETA'
>>> '\xe9'.decode('cp437') # byte E9 decoded using code page 437 is U+0398.
u'\u0398'
>>> ud.name(u'\u0398')
'GREEK CAPITAL LETTER THETA'
>>> print u'\xe9' # Unicode is encoded to CP437 correctly
é
>>> print '\xe9'  # Byte is just sent to terminal and assumed to be CP437.
Θ

sys.getdefaultencoding()仅在Python没有其他选项时使用。

请注意,Python 3.6或更高版本会忽略Windows上的编码,并使用Unicode API将Unicode写入终端。如果字体支持,则不显示UnicodeEncodeError警告并显示正确的字符。即使字体支持它,字符仍然可以从终端剪切到具有支持字体的应用程序,并且它将是正确的。升级!

答案 1 :(得分:8)

Python REPL尝试从您的环境中获取要使用的编码。如果它找到了理智的东西那么它就是Just Works。它是什么时候它无法弄清楚它发生了什么,它会出错。

>>> print sys.stdout.encoding
UTF-8

答案 2 :(得分:4)

通过输入显式Unicode字符串指定了编码。比较不使用u前缀的结果。

>>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> '\xe9'
'\xe9'
>>> u'\xe9'
u'\xe9'
>>> print u'\xe9'
é
>>> print '\xe9'

>>> 

\xe9的情况下,Python假定您的默认编码(Ascii),因此打印......空白。

答案 3 :(得分:0)

根据Python default/implicit string encodings and conversions

  • print unicode时,encode<file>.encoding进行对比。encoding
    • 如果未设置unicodestr会隐式转换为sys.getdefaultencoding()(因为该编解码器为ascii,即UnicodeEncodeError,国家字符会导致encoding
    • 对于标准流,tty是从环境推断的。它通常设置了fot print u'\xe9'个流(来自终端的区域设置),但很可能没有为管道设置
      • 因此当输出到终端时encode()可能会成功,如果它被重定向则失败。解决方案是在print之前print str具有所需编码的字符串。
  • source activate 'my-conda-python3' source activate tensorflow (tensorflow) jupyter notebook input$map_bounds时,字节将按原样发送到流。终端显示的字形将取决于其语言环境设置。

答案 4 :(得分:-1)

它对我有用:

import sys
stdin, stdout = sys.stdin, sys.stdout
reload(sys)
sys.stdin, sys.stdout = stdin, stdout
sys.setdefaultencoding('utf-8')