如果我有一个unicode字符串列表
lst = [ u"aaa", u"bbb", u"foo", u"bar", ... u"baz", u"zzz" ]
是否有必要在每个字符串之前写一个前缀u
?我可以构建一个构造,说lst的每个元素都是unicode字符串,然后在没有u
前缀的情况下写它吗?
答案 0 :(得分:14)
在Python 2.7(也是Python 2.6)中,您可以将unicode文字作为模块的默认值:
from __future__ import unicode_literals
您必须在文件顶部包含导入,然后它将应用于文件中的所有字符串文字。使用b
前缀强制字节字符串:
>>> from __future__ import unicode_literals
>>> "sss"
u'sss'
>>> b"x"
'x'
答案 1 :(得分:1)
如果您打算将一组标准字符串转换为unicode,则可以将该函数映射到列表中:
lst = ["aaa", "bbb", "ccc"]
map(unicode, lst)
哪个给出了
[u"aaa", u"bbb", u"ccc"]
但是,如果lst
包含非ASCII字符串,则必须使用u
为该特定字符串添加前缀。如果您不这样做,您将在转换时收到此错误:
lst = ["\xe4"]
map(unicode,lst)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
正如评论中所指出的,对于Python 2.x或3.x,这个答案是不同的。在Python 3中,everything changes:
您认为关于二进制数据和Unicode的所有信息都已发生变化。 Python 3.0使用文本和(二进制)数据的概念而不是Unicode字符串和8位字符串。所有文本都是Unicode;但编码的Unicode表示为二进制数据。用于保存文本的类型是str,用于保存数据的类型是字节。与2.x情况的最大区别在于,任何在Python 3.0中混合文本和数据的尝试都会引发TypeError,而如果您要在Python 2.x中混合使用Unicode和8位字符串,那么如果8位字符串碰巧只包含7位(ASCII)字节,但如果包含非ASCII值,则会得到UnicodeDecodeError。这种特定价值的行为多年来引起了许多悲伤的表情。