由于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)
做了我需要的,但它真的很难看。必须有一个更好的解决方案。有什么想法吗?
答案 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扩展无法处理当前代码页设置之外的字符。