如何从unicode文字创建unicode实例

时间:2014-05-14 23:08:54

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

由于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)做了我需要的,但它真的很难看。必须有一个更好的解决方案。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

  

我使用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扩展无法处理当前代码页设置之外的字符。