我怎么知道什么时候'str'能够处理unicode,什么时候不能?

时间:2016-06-19 10:10:44

标签: python unicode

为什么str运算符能够将unicode对象列表转换为str对象,但无法转换单个unicode对象?

例如,在下面的代码中,我创建了一个unicode对象列表,然后尝试打印出该列表。在第二个print语句中,我只是打印出一个unicode对象。

bill = []
bill.append(u'的东西')
bill.append(u'的东西')

print("list is " + str(bill)) # this is OK
print ("this string is " + str(u'的东西')) # generates a UnicodeEncodeError

第一个印刷语句导致:

list is [u'\u7684\u4e1c\u897f', u'\u7684\u4e1c\u897f']

但第二个:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)

我可以看到,在第一个语句中,实际的unicode对象正在打印,而不是使用任何编解码器转换 - 为什么不能对单个对象进行此操作?

1 个答案:

答案 0 :(得分:1)

您正在寻找repr() function;列表不能直接支持str(),默认的回退是生成repr()的输出。

repr()将始终为内置类型生成ASCII安全输出:

>>> bill = [u'的东西', u'的东西']
>>> print repr(bill[0])
u'\u7684\u4e1c\u897f'

对于listtupledictset等内置容器,内容始终以递归方式用repr()内容表示。

请注意,repr()旨在生成调试输出,而不是用户可读的输出。如果您需要处理文本,在摄取时解码(除非您使用的API已经为您解码),请坚持在代码中使用Unicode,在生成输出时进行编码(同样,除非API已经编码,比如print会)。我强烈建议您阅读/观看Pragmatic Unicode by Ned Batchelder以更好地理解Python和Unicode。