Python - unicode字符串中的ASCII编码字符串;如何删除' u'?

时间:2015-05-04 08:34:07

标签: python unicode encoding ascii urlencode

当我使用python模块' pygoogle'在中文里,我得到了像u'http://zh.wikipedia.org/zh/\xe6\xb1\x89\xe8\xaf\xad'

这样的网址

它的unicode但包括ascii。我尝试将其编码回utf-8,但代码也要改变。

a =  u'http://zh.wikipedia.org/zh/\xe6\xb1\x89\xe8\xaf\xad'
a.encode('utf-8')
>>> 'http://zh.wikipedia.org/zh/\xc3\xa6\xc2\xb1\xc2\x89\xc3\xa8\xc2\xaf\xc2\xad'

我也尝试使用:

str(a)

但我收到了错误:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 27-32: ordinal not in range(128)

如何对其进行编码以删除' u'吗

顺便说一下,如果没有' u'我会得到正确的结果,如:

s = 'http://zh.wikipedia.org/zh/\xe6\xb1\x89\xe8\xaf\xad'
print s
>>> http://zh.wikipedia.org/zh/汉语

1 个答案:

答案 0 :(得分:8)

你有Mojibake;在这种情况下,那些UTF-8字节被解码,就好像它们是Latin-1字节一样。

要反转该过程,请再次编码为Latin-1:

>>> a =  u'http://zh.wikipedia.org/zh/\xe6\xb1\x89\xe8\xaf\xad'
>>> a.encode('latin-1')
'http://zh.wikipedia.org/zh/\xe6\xb1\x89\xe8\xaf\xad'
>>> print a.encode('latin-1')
http://zh.wikipedia.org/zh/汉语

print工作正常,因为我的终端配置为处理UTF-8。您可以通过解码为UTF-8来再次获取unicode对象:

>>> a.encode('latin-1').decode('utf8')
u'http://zh.wikipedia.org/zh/\u6c49\u8bed'

ISO-8859-1(Latin-1)编解码器将一对一映射到前255个Unicode码点,这就是字符串内容看起来不变的原因。

您可能希望将ftfy library用于此类作业;它处理各种各样的文本问题,包括Windows代码页Mojibake,其中一些产生的代码点'不能在法律上对代码页进行编码。 ftfy.fix_text()函数接受Unicode输入并对其进行修复:

>>> import ftfy
>>> ftfy.fix_text(a)
u'http://zh.wikipedia.org/zh/\u6c49\u8bed'