【问题标题】:How to create an unicode instance from an unicode literal如何从 unicode 文字创建 unicode 实例
【发布时间】:2014-05-14 23:08:53
【问题描述】:

由于 C 扩展中的一些错误,我正在获取带有 str 实例的 unicode 数据,或者换句话说,str 根本没有编码和 unicode 文字。

因此,例如,这是一个有效的 unicode 文字

>>> u'\xa1Se educado!'

UTF-8 编码的 str 将是:

>>> '\xc2\xa1Se educado!'

但是,我得到一个带有 unicode 文字的 str:

>>> '\xa1Se educado!'

我需要从中创建一个 unicode 实例。使用 unicode() 不起作用,因为它需要编码。我认为''.join(unichr(ord(x)) for x in s) 可以满足我的需要,但它真的很难看。必须有更好的解决方案。有什么想法吗?

【问题讨论】:

  • 您使用的 Python 版本是什么?造成问题的扩展是什么?你能在那里纠正吗?
  • Python 2.7。扩展名并不相关。

标签: python python-2.7 unicode encoding unicode-literals


【解决方案1】:

正如我所怀疑的,必须有一种方法可以使用 python 用于 unicode 的任何“编码”来解码它,那就是 raw_unicode_escape

>>> unicode('\xa1Se educado!', 'raw_unicode_escape')
u'\xa1Se educado!'

【讨论】:

    【解决方案2】:

    我得到一个带有 unicode 文字的 str:'\xa1Se educado!'

    不是真的,\xa1 不是 Unicode 特定的转义。字节字符串中的\xa1 表示字节编号161,Unicode 字符串中的\xa1 表示字符(代码点)编号161——与\u00A1 相同。

    您所拥有的是一个字节字符串,其中包含¡Se educado! 的 ISO-8859-1 编码,而不是 UTF-8 编码。在 ISO-8859-1 编码中,每个字节数恰好匹配同一代码点编号的 Unicode 字符。要将 ISO-8859-1 字节字符串解码为 Unicode 字符串,请使用:

    >>> '\xa1Se educado!'.decode('iso-8859-1')
    u'\xa1Se educado!'
    

    虽然实际上如果您使用的是 Windows,那么编码可能是代码页 1252 ('windows-1252') 而不是 ISO-8859-1。它们是相似的编码,但并不完全相同。代码页 1252 是 Windows 在西欧和美国区域设置中用于非 Unicode 应用程序的默认“ANSI”代码页。如果您从在同一台机器上运行的 Windows 非 Unicode 应用程序获取此数据,则应使用编码 'mbcs' 对其进行解码,该编码对应于特定于语言环境的默认代码页。

    这些是不能容纳所有 Unicode 字符的旧式编码。您可能会发现 C 扩展根本无法处理当前代码页集之外的字符。

    【讨论】:

    • 不。该示例很差,因为它与 ISO-8859-1 匹配,但只要我有 unicode 独有的字符,它就会中断并且我得到转义的 \u 序列。例如,u'€95.00' 将显示为 '\u20ac95.00'。我很确定有人正在以某种方式编写原始 python unicode。无论如何感谢您的帮助。
    • 字节字符串中没有\u 转义——您的意思是说您有'\\u20ac95.00'?然而你有'\xa1'(即文字字节161,而不是'\\xa1')字符U+0000到U+00FF?
    猜你喜欢
    • 1970-01-01
    • 2017-11-23
    • 2019-09-07
    • 2012-04-10
    • 2012-03-19
    • 2011-06-27
    • 2011-07-31
    • 2012-10-08
    • 1970-01-01
    相关资源
    最近更新 更多