unicode字符串列表

时间:2012-02-01 14:24:46

标签: python unicode

如果我有一个unicode字符串列表

lst = [ u"aaa", u"bbb", u"foo", u"bar", ... u"baz", u"zzz" ]

是否有必要在每个字符串之前写一个前缀u?我可以构建一个构造,说lst的每个元素都是unicode字符串,然后在没有u前缀的情况下写它吗?

2 个答案:

答案 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。这种特定价值的行为多年来引起了许多悲伤的表情。