В качестве части сайта Django пользователи могут вводить названия улиц, и запись будет добавлена в ссылку геокодирования Google Maps. Все работает хорошо, пока пользователи не вводят специальные символы.
Я хотел бы отобразить специальный символ в ссылке, однако python заменяет символ символом Unicode. Есть ли способ предотвратить переход python в unicode и просто ввод пользователей? Я пробовал несколько декодеров и форматов, но это не решило проблему.
edit: код запрограммирован в Python 2.
В настоящее время я запрашиваю ответ JSON следующим образом:
url = "http://maps.googleapis.com/maps/api/geocode/json?address=" +
addressString.decode('ascii') + "&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";
Если addressString - это строковый объект (не-Юникод) (в Python 2) или объект bytes (в Python 3), он должен быть уже закодирован в UTF-8. В этом случае попробуйте выполнить следующее:
url = "http://maps.googleapis.com/maps/api/geocode/json?address=" +
urllib.quote(addressString) + "&sensor=false";
Оба этих фрагмента должны преобразовывать символы Unicode в escape-последовательности URL-адресов, используя знаки %
. Это стандартный способ использования символов, отличных от ASCII, в URL-адресе. Современные браузеры должны декодировать эти последовательности, отображая их как символы Unicode.
Exception Type: UnicodeEncodeError Exception Value: 'ascii' codec can't encode character u'\xdf' in position 10: ordinal not in range(128)
при запросе ссылки. Я думаю, мне нужно посмотреть дальше в проблему. Спасибо за ваше предложение.
[большой жирный комментарий, потому что комментарии не могут быть отформатированы хорошо)
Следуя инструкциям @Boaz, Янив работает для меня:
>>> addressString = 'Wilhelmstra\xc3\x9fe 123, T\xc3\xbcbingen, Deutschland'
Это a 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'
, объект str
, закодированный в latin1 или cp1252 или что-то еще. Вам нужно будет декодировать это для объекта unicode
, а затем закодировать это в UTF-8, а затем уклониться от него.
Однако, если у вас есть (ОЧЕНЬ тонкая разница) u'Wilhelmstra\xdfe 123, T\xfcbingen, Deutschland'
, это объект unicode
, и вам нужно будет закодировать его в UTF-8, а затем процент-избежать его.
Ты сказал "" я все равно получаю такое же сообщение об ошибке: Тип исключения: UnicodeEncodeError Значение исключения: кодек 'ascii' не может кодировать символ u '\ xdf' в позиции 10: порядковый номер не в диапазоне (128) при запросе ссылки ""
Похоже, вы кормите объект unicode
тем, что хочет объект str
, и пытается получить его путем кодирования с использованием (обычного по умолчанию) ascii
кодирования. Если у вас по-прежнему возникает эта проблема, покажите свой код. Переломите его до минимума, необходимого (как я сделал выше). Показать превью (step_by_step_results).
Не уверен, попробуйте:
url = "http://maps.googleapis.com/maps/api/geocode/json?address=" +
addressString.decode('utf-8') + "& sensor = false";
googleResponse = urllib.urlopen(url);