现在,python的print函数处理unicode的方式与编写Dive Into Python时的方式不同吗?

dsi*_*ard 4 python unicode character-encoding

我试图通过回到基础知识来解决一些令人沮丧的编码问题.在Dive Into Python示例9.14(此处)中,我们有:

>>> s = u'La Pe\xf1a'
>>> print s
Traceback (innermost last): File "<interactive input>", line 1, in ?
UnicodeError: ASCII encoding error: ordinal not in range(128)
>>> print s.encode('latin-1')
La Peña
Run Code Online (Sandbox Code Playgroud)

但在我的机器上,这种情况发生了:

>>> sys.getdefaultencoding()
'ascii'
>>> s = u'La Pe\xf1a'
>>> print s
La Peña
Run Code Online (Sandbox Code Playgroud)

我不明白为什么这些不同.任何人?

Luk*_*ský 6

默认编码print不依赖于sys.getdefaultencoding(),而是依赖于sys.stdout.encoding.如果您使用eg启动python LANG=C或将python脚本重定向到文件,则stdout的编码将是ANSI_X3.4-1968.另一方面,如果sys.stdout是终端,它将使用终端的编码.

解释是什么sys.getdefaultencoding()- 当从/向unicode隐式转换字符串时使用它.在此示例中,str(u'La Pe\xf1a')默认ASCII编码将失败,但使用修改后的默认编码,它会将字符串编码为Latin-1.但是设置默认编码是一个可怕的想法,当你想从去你应该始终使用显式编码unicodestr.