为什么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对象正在打印,而不是使用任何编解码器转换 - 为什么不能对单个对象进行此操作?
答案 0 :(得分:1)
您正在寻找repr()
function;列表不能直接支持str()
,默认的回退是生成repr()
的输出。
repr()
将始终为内置类型生成ASCII安全输出:
>>> bill = [u'的东西', u'的东西']
>>> print repr(bill[0])
u'\u7684\u4e1c\u897f'
对于list
,tuple
,dict
和set
等内置容器,内容始终以递归方式用repr()
内容表示。
请注意,repr()
旨在生成调试输出,而不是用户可读的输出。如果您需要处理文本,在摄取时解码(除非您使用的API已经为您解码),请坚持在代码中使用Unicode,在生成输出时进行编码(同样,除非API已经编码,比如print
会)。我强烈建议您阅读/观看Pragmatic Unicode by Ned Batchelder以更好地理解Python和Unicode。