【问题标题】:List of unicode stringsUnicode 字符串列表
【发布时间】:2012-02-01 14:24:46
【问题描述】:

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

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

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

【问题讨论】:

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

标签: python unicode


【解决方案1】:

在 Python 2.7(也是 Python 2.6)中,您可以将 unicode 文字设为模块的默认值:

from __future__ import unicode_literals

您必须在文件顶部包含导入,然后它将应用于文件中的所有字符串文字。使用b 前缀强制字节字符串:

>>> from __future__ import unicode_literals
>>> "sss"
u'sss'
>>> b"x"
'x'

【讨论】:

    【解决方案2】:

    如果您打算将一组标准字符串转换为 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)
    

    如 cmets 中所述,此答案对于 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 位string 恰好只包含 7 位 (ASCII) 字节,但如果它包含非 ASCII 值,您会得到 UnicodeDecodeError。多年来,这种特定于价值的行为引起了无数悲伤的面孔。

    【讨论】:

    • 我只想使用一些更好的声明来节省我的打字时间。像lst = u["aaa", "bbb", "ccc"] 这样的东西会告诉lst 中的每个字符串都是unicode。
    • -1 不了解 unicode 编码,并认为“ASCII 是可以的”- 请阅读joelonsoftware.com/articles/Unicode.html
    • @jsbueno - 我没有说过默认的 Python 2.x 编码 (ASCII) 是“OK”。我只是陈述了一种快速而肮脏的方法,用于将 OP 的看似只有 ASCII 编码的列表转换为具有显式 ASCII 编码的 unicode 表示。是他想要的吗?我不完全确定,因为他没有指定他想要的编码,所以我猜了一下。为了给本站增值,如果您觉得需要对不同编码进行详细说明,请在另一个答案中提供!
    猜你喜欢
    • 2023-04-09
    • 1970-01-01
    • 2012-09-14
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 2014-09-30
    • 2012-03-22
    • 2014-04-09
    相关资源
    最近更新 更多