Python中的Unicode混淆
在一个Django网站中,用户可以输入街道名称,这些名称会被添加到一个谷歌地图的地址链接里。一切运行得很好,直到用户输入一些特殊字符。
我想在链接中显示这些特殊字符,但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);
谢谢你的帮助和建议。
3 个回答
不太确定,可以试试:
首先,我们创建一个网址,格式是这样的:
url = "http://maps.googleapis.com/maps/api/geocode/json?address=" +
addressString.decode('utf-8') + "&sensor=false";
这里的意思是,我们把一个地址(addressString)放到网址里,然后把它转成可以用的格式(utf-8)。最后,我们加上一个参数(sensor=false),这个参数是用来告诉谷歌我们不需要传感器的数据。
接下来,我们用这个网址去请求谷歌的服务,得到的结果保存在googleResponse里:
googleResponse = urllib.urlopen(url);
[因为评论不能很好地格式化,所以写了个大评论]
按照@Boaz Yaniv的指示对我来说是有效的:
>>> addressString = 'Wilhelmstra\xc3\x9fe 123, T\xc3\xbcbingen, Deutschland'
这是一个 str
对象,使用UTF-8编码。我们需要对它进行百分号转义,这样才能在网址中使用。
>>> 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' 编解码器无法在位置10编码字符u'\xdf':序号不在范围(128)内,当请求链接时 """
这看起来像是你把一个 unicode
对象传给了一个需要 str
对象的地方,而它试图使用(通常的默认) ascii
编码来获取它。如果你继续遇到这个问题,展示你的代码。把它简化到最基本的部分(就像我上面做的那样)。展示一下逐步结果的表示形式(repr)。
首先,检查一下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字符。