为什么在ipython中打印unicode对象不会出错?

2024-04-25 13:41:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我问过A python program fails to execute in sublime text 3, but success in bash。我做了一些研究,发现有必要开始一个新问题。你知道吗

在python2.7中,sys.getdefaultencoding()是ascii码:

In [1]: import sys

In [2]: sys.getdefaultencoding()
Out[2]: 'ascii'

在我看来,打印对象等于print str(obj)。如果obj是unicode,它将被编码为ascii。例如(测试.py)地址:

#-*- encoding:utf-8 -*-
import sys
print sys.getdefaultencoding()  # ascii
print "你好"
print u"你好"  # should be an error occured: UnicodeEncodeError: 'ascii' codec...

但ipython中没有发生错误:

In [3]: print "你好"
你好

In [4]: print u"你好"
你好

为什么在ipython中打印unicode对象不会出错?我的理解不对?你知道吗


Tags: to对象inimportobjexecuteipythonsys
1条回答
网友
1楼 · 发布于 2024-04-25 13:41:45

打印时,仅当Python无法确定终端编码时才使用默认编码。两者都适用于您的情况,因为第一个"你好"是已经在终端编码中编码的字节字符串。第二个u"你好"是一个Unicode字符串,它将在终端编码中编码,前一个命令已经显示支持中文。你知道吗

ascii在python2.X将Unicode字符串强制转换为字节字符串时使用。例如,语句u'你好'.decode('utf8')是一个常见错误,其中对Unicode字符串调用.decode(),但只有字节字符串具有.decode()方法。Python然后尝试使用默认的ascii编解码器将Unicode字符串编码为字节字符串,以便可以调用.decode()。你知道吗

示例如下,但请注意这是一个编码错误而不是解码错误:

>>> u'你好'.decode('utf8')
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
  File "d:\dev\Python27\lib\encodings\utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

相关问题 更多 >