2011-05-09 119 views
1

作为Django网站的一部分,用户可以输入街道名称,并将条目添加到Google地图地理编码链接中。一切运作良好,直到用户输入特殊字符。与Python中的unicode混淆

我想显示链接中的特殊字符,但python用unicode符号替换字符。 有没有办法阻止python切换到unicode,并简单地采取用户输入?我尝试了几种解码器和格式,但它没有解决问题。

编辑:代码编程在Python 2

我现在请求JSON回应如下:

url = "http://maps.googleapis.com/maps/api/geocode/json?address=" + 
      addressString.decode('ascii') + "&sensor=false"; 
    googleResponse = urllib.urlopen(url); 

谢谢您的帮助和建议。

+2

你需要指定这是python2还是python3,因为unicode处理在Python3中得到了显着改进 – ninjagecko 2011-05-09 12:13:09

+0

你是否希望Unicode字符在URL中显示为真实字符(即不是百分号序列)?因为这取决于浏览器,而不是Python。大多数现代浏览器应将这些序列转换为Unicode,但不能在URL中直接使用Unicode - 该标准仅允许使用ASCII。 – 2011-05-09 12:16:42

+0

@ninjagecko:http://docs.djangoproject.com/en/dev/faq/install/#can-i-use-django-with-python-3 – 2011-05-09 12:18:16

回答

5

首先,检查addressString是一个Unicode对象(这是如果你使用Python 3,或者如果type(addressString)显示'unicode')。如果是,那么你可能需要尝试以下方法:

url = "http://maps.googleapis.com/maps/api/geocode/json?address=" + 
     urllib.quote(addressString.encode('utf-8')) + "&sensor=false"; 

如果addressString是一个(非Unicode)字符串对象(在Python 2)或字节的对象(在Python 3),那么它必须是已经以UTF-8编码。在这种情况下,请尝试以下操作:

url = "http://maps.googleapis.com/maps/api/geocode/json?address=" + 
     urllib.quote(addressString) + "&sensor=false"; 

这些片断都应该在Unicode字符转换为使用%迹象URL转义序列。这是在URL中使用非ASCII字符的标准方式。现代浏览器应该解码这些序列,将它们显示为Unicode字符。

+0

我试过你的例子 - 谢谢你的提交 - 但我仍然得到相同的错误信息:'异常类型:UnicodeEncodeError 异常值:'ascii'编解码器无法编码字符u'\ xdf'在位置10:序号请求链接时不在范围(128)内。我想我需要进一步研究这个问题。感谢您提交。 – neurix 2011-05-09 12:38:31

+1

你尝试过吗?你有没有检查什么样的对象addressString?它是如何编码的?如果不知道这些细节,我们无法回答您。 – 2011-05-09 12:40:38

+1

@neurix:也可以按照John Machin的建议尝试'print repr(addressString)'。 – 2011-05-09 12:41:21

0

不肯定,请尝试:

URL = “http://maps.googleapis.com/maps/api/geocode/json?address=” +
addressString.decode(“UTF-8 ')+“& sensor = false”;
googleResponse = urllib.urlopen(url);

+0

我也试过 - 没有任何运气。 – neurix 2011-05-09 12:19:08

+0

urllib.urlopen()不采用unicode。您需要使用UTF-8对其进行编码,然后以百分号进行编码 - 请参阅@Boaz Yaniv的答案。 – 2011-05-09 12:34:51

2

[大发评论,因为意见不能被格式化以及]

继@Boaz的Yaniv的指令工作对我来说:

>>> addressString = 'Wilhelmstra\xc3\x9fe 123, T\xc3\xbcbingen, Deutschland' 

这是一个str ojbject,在UTF-8编码。我们需要百分比转义它,以便它可以在URL中使用。

>>> import urllib 
>>> fixed = urllib.quote(addressString) 
>>> print repr(fixed) 
'Wilhelmstra%C3%9Fe%20123%2C%20T%C3%BCbingen%2C%20Deutschland' 

现在,让我们尝试一下:

>>> url = "http://maps.googleapis.com/maps/api/geocode/json?address=" + fixed + 
"&sensor=false" 
>>> guff = urllib.urlopen(url).read() 
>>> import json 
>>> print repr(json.loads(guff)['results'][0]['formatted_address']) 
u'Wilhelmstra\xdfe 123, 72074 T\xfcbingen, Germany' 
>>> 

如果你有这样的事情:'Wilhelmstra\xdfe 123, T\xfcbingen, Deutschland',这是在LATIN1或CP1252或任何编码的str对象。你需要将它解码为一个unicode对象,然后使用UTF-8对其进行编码,然后百分比转义。

但是,如果你有(很微妙的差异)u'Wilhelmstra\xdfe 123, T\xfcbingen, Deutschland',这是一个unicode对象,你需要用UTF-8编码,然后百分号转义它。

你说的“”“ 我仍然得到相同的错误信息:异常类型:UnicodeEncodeError异常值:'ascii'编解码器无法编码字符u'\ xdf'在位置10:序号不在范围内(128)请求链接 “””

时,这看起来像你喂unicode对象一些东西,想要一个str对象,并尝试使用(通常默认)ascii编码编码得到它。如果你仍然有这个问题,请显示你的代码。将其分解到必要的最小值(正如我上面所做的那样)。显示repr(step_by_step_results)。