我可以在python 2.6.5中为urllib.quote和urllib.unquote使用可用于Unicode的替代方法吗?

发布于 2021-01-29 18:15:37

Pythonurllib.quoteurllib.unquote不能在Python 2.6.5中正确处理Unicode。这是发生了什么:

In [5]: print urllib.unquote(urllib.quote(u'Cataño'))
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)

/home/kkinder/<ipython console> in <module>()

/usr/lib/python2.6/urllib.pyc in quote(s, safe)
   1222             safe_map[c] = (c in safe) and c or ('%%%02X' % i)
   1223         _safemaps[cachekey] = safe_map
-> 1224     res = map(safe_map.__getitem__, s)
   1225     return ''.join(res)
   1226

KeyError: u'\xc3'

将值编码为UTF8也不起作用:

In [6]: print urllib.unquote(urllib.quote(u'Cataño'.encode('utf8')))
Cataño

它被认为是错误,并且有修复程序,但不适用于我的Python版本。

我想要的是类似于urllib.quote / urllib.unquote的东西,但是可以正确处理unicode变量,因此该代码可以正常工作:

decode_url(encode_url(u'Cataño')) == u'Cataño'

有什么建议吗?

关注者
0
被浏览
46
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    Python的urllib.quote和urllib.unquote无法正确处理Unicode

    urllib根本不处理Unicode。根据定义,URL不包含非ASCII字符。在处理时,urllib应仅使用字节字符串。如果希望这些字符代表Unicode字符,则必须手动对其进行编码和解码。

    IRI可以包含非ASCII字符,将它们编码为UTF-8序列,但是Python目前没有irilib

    将值编码为UTF8也不起作用:

    In [6]: print urllib.unquote(urllib.quote(u'Cataño'.encode('utf8')))
    Cataño
    

    嗯,好了,现在您要在控制台中输入Unicode,然后print对控制台执行-
    Unicode。通常这是不可靠的,尤其是在Windows中以及使用IPython控制台的情况下。

    使用反斜杠序列将其键入很长的距离,您可以更容易地看到该urllib位确实起作用:

    >>> u'Cata\u00F1o'.encode('utf-8')
    'Cata\xC3\xB1o'
    >>> urllib.quote(_)
    'Cata%C3%B1o'
    
    >>> urllib.unquote(_)
    'Cata\xC3\xB1o'
    >>> _.decode('utf-8')
    u'Cata\xF1o'
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看