Python中与unicode的混淆

Python中与unicode的混淆,python,unicode,ascii,hyperlink,decode,Python,Unicode,Ascii,Hyperlink,Decode,作为Django网站的一部分,用户可以输入街道名称,该条目将添加到谷歌地图地理编码链接中。在用户输入特殊字符之前,一切正常 我希望在链接中显示特殊字符,但是python会用unicode符号替换该字符有没有办法防止python切换到unicode并简单地接受用户输入?我尝试了几种解码器和格式,但没有解决问题 编辑:代码是用Python 2编程的 我目前正在请求JSON响应,如下所示: url = "http://maps.googleapis.com/maps/api/geocode/j

作为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);
感谢您的帮助和建议。

不确定,请尝试:

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

不确定,请尝试:

url=”http://maps.googleapis.com/maps/api/geocode/json?address=“+
addressString.decode('utf-8')+“&sensor=false”

googleResponse=urllib.urlopen(url)

首先,检查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";
url = "http://maps.googleapis.com/maps/api/geocode/json?address=" +
      urllib.quote(addressString) + "&sensor=false";
如果addressString是(非unicode)字符串对象(在Python2中)或字节对象(在Python3中),那么它必须已经用UTF-8编码。在这种情况下,请尝试以下操作:

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

这两个代码段都应该使用
%
符号将unicode字符转换为URL转义序列。这是在URL中使用非ASCII字符的标准方法。现代浏览器应该解码这些序列并将其显示为Unicode字符。

首先,检查addressString是否为Unicode对象(如果您使用的是Python 3,则为Unicode对象,或者
类型(addressString)
是否显示“Unicode”)。如果是,则可能需要尝试以下操作:

url = "http://maps.googleapis.com/maps/api/geocode/json?address=" +
      urllib.quote(addressString.encode('utf-8')) + "&sensor=false";
url = "http://maps.googleapis.com/maps/api/geocode/json?address=" +
      urllib.quote(addressString) + "&sensor=false";
如果addressString是(非unicode)字符串对象(在Python2中)或字节对象(在Python3中),那么它必须已经用UTF-8编码。在这种情况下,请尝试以下操作:

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

这两个代码段都应该使用
%
符号将unicode字符转换为URL转义序列。这是在URL中使用非ASCII字符的标准方法。现代浏览器应该对这些序列进行解码,并将其显示为Unicode字符。

[因为注释的格式不好,所以注释太多了]

按照@Boaz Yaniv的指示为我工作:

>>> addressString = 'Wilhelmstra\xc3\x9fe 123, T\xc3\xbcbingen, Deutschland'
这是一个
str
oject,用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'
,那是一个
str
对象,用拉丁文1或cp1252或其他语言编码。您需要将其解码为
unicode
对象,然后用UTF-8编码,然后转义它

但是,如果您有(非常细微的差别)
u'willilmstra\xdfe 123,T\xfcbingen,Deutschland'
,这是一个
unicode
对象,您需要用UTF-8编码,然后百分比转义它

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


这看起来像是将一个
unicode
对象馈送给需要
str
对象的对象,并尝试通过使用(通常默认)
ascii
编码来获取该对象。如果仍然存在此问题,请显示代码。将其分解到所需的最小值(正如我上面所做的)。显示repr(一步一步的结果)。

[因为注释格式不好,所以注释太多]

按照@Boaz Yaniv的指示为我工作:

>>> addressString = 'Wilhelmstra\xc3\x9fe 123, T\xc3\xbcbingen, Deutschland'
这是一个
str
oject,用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'
,那是一个
str
对象,用拉丁文1或cp1252或其他语言编码。您需要将其解码为
unicode
对象,然后用UTF-8编码,然后转义它

但是,如果您有(非常细微的差别)
u'willilmstra\xdfe 123,T\xfcbingen,Deutschland'
,这是一个
unicode
对象,您需要用UTF-8编码,然后百分比转义它

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


这看起来像是将一个
unicode
对象馈送给需要
str
对象的对象,并尝试通过使用(通常默认)
ascii
编码来获取该对象。如果仍然存在此问题,请显示代码。将其分解到所需的最小值(正如我上面所做的)。Show repr(一步一步的结果)。

您需要指定这是python2还是python3,因为python3中的unicode处理得到了显著改进。您是否希望unicode字符在URL中显示为真实字符(即不是百分比序列)?因为这取决于浏览器,而不是Python。大多数现代浏览器都应该将这些序列转换为Unicode,但您不能在URL中直接使用Unicode-标准只允许ASCII。@ninjagecko:@neurix:print repr(addressString)产生了什么?@neurix:[叹气]没有(除非您的Python完全崩溃)。它要么打印
'statstra\xc3\x9fe'
(希望如此),要么打印
u'statstra\xc3\x9fe'
(不寒而栗)。
type(addressString)
产生了什么?您需要指定这是python2还是python3,因为python3Do中的unicode处理得到了显著改进。您希望unicode字符在URL中显示为实c