1

由于 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) 我的需求,但这真的很难看。必须有更好的解决方案。有任何想法吗?

4

2 回答 2

1

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

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

您所拥有的是一个包含 ISO-8859-1 编码¡Se educado!而不是 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 扩展根本无法处理当前代码页集之外的字符。

于 2014-05-15T15:16:52.060 回答
1

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

>>> unicode('\xa1Se educado!', 'raw_unicode_escape')
u'\xa1Se educado!'
于 2014-05-14T23:33:41.317 回答