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)
你有一个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)
| 归档时间: |
|
| 查看次数: |
1099 次 |
| 最近记录: |