当前位置: 首页 > 面试题库 >

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

郗唯
2023-03-14
问题内容

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'

有什么建议吗?


问题答案:

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'


 类似资料:
  • 问题内容: 我打算在我的代码中使用以获得更好的性能。 但是,出现以下错误: 我尝试了另一种方式,并收到此错误: 我的代码如下所示: 我认为由于未在main函数中使用而引起了错误。 我的猜想对吗?以及如何修改代码以修复错误? 问题答案: 问题是您在实例中有一个无法拾取的实例变量()。因为您正在调用实例方法,并且您正在Windows上运行,所以整个实例都必须是可腌制的,才能将其传递给子进程。是一个打开

  • 问题内容: 我正在使用 EclipseLink的JAXB实现的一些非标准扩展,并且要启用该实现,必须使用jaxb.properties对其进行配置。效果很好。 但是,由于生成错误,属性文件未包含在正确的位置,从而导致使用默认的JAXB,该文件没有任何错误,只是继续解析XML文件,忽略了非标准扩展名,给我留下了一个非工作bean。 为了使它更加健壮,我想摆脱属性文件,并在代码中指定上下文配置。由于它

  • 问题内容: 将getDerivedStateFromProps添加为遗留componentWillReceiveProps的一种更安全的替代方法。 这就是16.3文档所说的内容。这个生命周期还有什么要改变的吗?还是只是改名? 问题答案: 不只是将名称更改为。这是一个静态方法,在实例化组件之后或在接收新道具之前会调用它,这与在初始渲染时未调用过的方法不同。 返回对象以更新属性以响应道具更改。 返回n

  • 问题内容: 是否有与Python和等效的Javascript函数? 我遇到的最接近的是,和和(及其对应的非编码函数),但据我所知,它们不会对同一组特殊字符进行编码/解码。 谢谢, 卡梅伦 问题答案: 好的,我想我将使用一组混合的自定义函数: 编码:使用encodeURIComponent(),然后放回斜杠。 解码:对找到的所有%hex值进行解码。 这是我最终使用的内容的更完整变体(它也可以正确处理

  • 问题内容: 我是angularjs的新手。当我阅读文档时,发现它用作属性的前缀: 我想知道是否可以将其修改为另一个词,例如?因为我认为键入起来要容易得多。 问题答案: 从 v1.0.0rc1开始 ,它们都是等效的: 这是工作提琴:http : //jsfiddle.net/vojtajina/Fgf3Q/ 但是,这背后的主要原因是允许有效的html。因此,您可以为自定义指令使用前缀,但不能为Ang

  • 问题内容: 如果我想编码node.js并使用CoffeeScript,我有哪些限制?我可以做一些我在JS中可以做的事情吗? 问题答案: 是的,CoffeeScript可以简单地编译为纯JS,使其与node.js完全兼容。 要在节点上运行CoffeeScripts,您可以: 键入要编译的代码,然后运行已编译的JS。 只需输入