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

And*_*w.T 3 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'
Run Code Online (Sandbox Code Playgroud)

我也尝试使用:

str(a)
Run Code Online (Sandbox Code Playgroud)

但是我得到了错误:

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

如何对其进行编码以删除"你"?

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

s = 'http://zh.wikipedia.org/zh/\xe6\xb1\x89\xe8\xaf\xad'
print s
>>> http://zh.wikipedia.org/zh/??
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 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/??
Run Code Online (Sandbox Code Playgroud)

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

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

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

您可能希望将ftfy用于这些工作; 它处理各种各样的文本问题,包括Windows代码页Mojibake,其中一些产生的"代码点"不能合法地编码到代码页.该ftfy.fix_text()函数接受Unicode输入并修复它:

>>> import ftfy
>>> ftfy.fix_text(a)
u'http://zh.wikipedia.org/zh/\u6c49\u8bed'
Run Code Online (Sandbox Code Playgroud)