Unicode字符串列表

5
如果我有一个 Unicode 字符串列表。
lst = [ u"aaa", u"bbb", u"foo", u"bar", ... u"baz", u"zzz" ]

在每个字符串前面加上前缀u是必要的吗?我能否创建一个规则,使lst列表中的每个元素都成为Unicode字符串,并且不需要使用u前缀进行书写?


这取决于您使用Python 2还是Python 3。 - user647772
我正在使用Python 2.7.2+,但如果您知道两者的答案,这对未来可能会有用。 - xralf
在Python 3.x中,默认情况下所有字符串都是Unicode编码的,任何处理文本I/O(文件、数据库、打印)的通道都需要显式编码或默认使用系统范围内的编码。 - jsbueno
2个回答

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
如果您的意图是将一组标准字符串转换为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中,一切都改变了

你所知道的关于二进制数据和Unicode的一切都已经改变。Python 3.0使用文本和(二进制)数据的概念,而不是Unicode字符串和8位字符串。所有文本都是Unicode;然而编码的Unicode被表示为二进制数据。用于保存文本的类型是str,用于保存数据的类型是bytes。与2.x情况最大的区别是,在Python 3.0中任何尝试混合文本和数据的操作都会引发TypeError,而如果你在Python 2.x中混合Unicode和8位字符串,如果8位字符串恰好只包含7位(ASCII)字节,则可以工作,但如果它包含非ASCII值,则会得到UnicodeDecodeError。这种特定于值的行为多年来已经导致了无数的悲伤。


我想使用更好的声明来节省打字。例如 lst = u["aaa", "bbb", "ccc"],它会告诉每个字符串都是Unicode。 - xralf
如果你不了解Unicode编码,认为“ASCII没问题”的话,请阅读http://www.joelonsoftware.com/articles/Unicode.html。 - jsbueno
@jsbueno - 我从未说默认的Python 2.x编码(ASCII)是“OK”的。我只是陈述了一种快速而简单的方法,将OP的仅为ASCII编码的列表转换为具有显式ASCII编码的Unicode表示形式。这是否是他想要的?我不太确定,因为他没有指定他想要的编码,所以我猜测了一下。为了增加这个网站的价值,如果您认为需要详细解释不同的编码,请在另一个答案中提供它! - Hooked

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接