在utf-8字符串上使用python' urllib.quote_plus' safe'参数

时间:2014-03-14 20:41:06

标签: python utf-8 sparql urllib unicode-escapes

我在python代码中有一个unicode字符串:

name = u'Mayte_Martín'

我想将它与SPARQL查询一起使用,这意味着我应该使用'utf-8'对字符串进行编码,并在其上使用urllib.quote_plus或requests.quote。但是,这些引用函数的行为都很奇怪,因为在使用和不使用“安全”参数时可以看到。

from urllib import quote_plus

没有'安全'论点:

quote_plus(name.encode('utf-8'))
Output: 'Mayte_Mart%C3%ADn'

使用'safe'参数:

quote_plus(name.encode('utf-8'), safe=':/')
Output: 
---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
<ipython-input-164-556248391ee1> in <module>()
----> 1 quote_plus(v, safe=':/')

/usr/lib/python2.7/urllib.pyc in quote_plus(s, safe)
   1273         s = quote(s, safe + ' ')
   1274         return s.replace(' ', '+')
-> 1275     return quote(s, safe)
   1276 
   1277 def urlencode(query, doseq=0):

/usr/lib/python2.7/urllib.pyc in quote(s, safe)
   1264         safe = always_safe + safe
   1265         _safe_quoters[cachekey] = (quoter, safe)
-> 1266     if not s.rstrip(safe):
   1267         return s
   1268     return ''.join(map(quoter, s))

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 10: ordinal not in range(128)

问题似乎与rstrip功能有关。我试着做一些改变并打电话给......

quote_plus(name.encode('utf-8'), safe=u':/'.encode('utf-8'))

但这并没有解决问题。这可能是什么问题?

3 个答案:

答案 0 :(得分:11)

我回答了我自己的问题,以便它可以帮助那些面临同样问题的人。

当您在执行任何其他操作之前在当前工作空间中进行以下导入时,会出现此特定问题。

from __future__ import unicode_literals

这已经证明与以下代码序列不兼容。

from urllib import quote_plus

name = u'Mayte_Martín'
quote_plus(name.encode('utf-8'), safe=':/')

没有导入unicode_literals的相同代码可以正常工作。

答案 1 :(得分:4)

根据this bug,这是解决方法:

encode

您必须quote quote_plusutf-8方法fo:block-container两个参数<fo:flow flow-name="xsl-region-body"> <fo:block-container width="100%" color="rgb(0, 0, 0)" border="thin solid silver"> <fo:block-container border="thin solid yellow"> <fo:block-container width="50%" start-indent="1in" margin-top="1in" height="2in" border="thin solid black"><fo:block start-indent="0in">First Block</fo:block></fo:block-container> <fo:block-container width="50%" start-indent="2in" border="thin solid red"><fo:block start-indent="0in">Second Block</fo:block></fo:block-container> </fo:block-container> <fo:block-container border="thin solid purple"> <fo:block-container width="50%" start-indent="1in" margin-top="1in" height="1in" border="thin solid green"><fo:block start-indent="0in">Third Block</fo:block></fo:block-container> <fo:block-container width="50%" start-indent="2in" border="thin solid blue"><fo:block start-indent="0in">Fourth Block</fo:block></fo:block-container> </fo:block-container> </fo:block-container> </fo:flow>

答案 2 :(得分:0)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import urllib
name = u'Mayte_Martín'
print urllib.quote_plus(name.encode('utf-8'), safe=':/')

对我来说没有问题(Py 2.7.9,Debian)

(我不知道答案,但我不能就声誉做出评论)