Путаница с юникодом в Python

1

В качестве части сайта 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);

Благодарим вас за помощь и советы.

  • 2
    вам нужно будет указать, является ли это python2 или python3, так как обработка в юникоде значительно улучшена в python3
  • 0
    Хотите ли вы, чтобы символы Юникода отображались в URL как реальные символы (т.е. не в процентах)? Потому что это зависит от браузера, а не от Python. Большинство современных браузеров должны конвертировать эти последовательности в Unicode, но вы не можете использовать Unicode напрямую в URL - стандарт допускает только ASCII.
Показать ещё 5 комментариев
Теги:
hyperlink
unicode
ascii
decode

3 ответа

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 - это строковый объект (не-Юникод) (в 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.

  • 0
    Я попробовал ваш пример - спасибо за ваше представление - но я все еще получаю то же сообщение об ошибке: Exception Type: UnicodeEncodeError Exception Value: 'ascii' codec can't encode character u'\xdf' in position 10: ordinal not in range(128) при запросе ссылки. Я думаю, мне нужно посмотреть дальше в проблему. Спасибо за ваше предложение.
  • 1
    Ты пробовал оба? И вы проверили, что это за объект addressString? Как это закодировано? Мы не можем ответить вам, не зная этих деталей.
Показать ещё 1 комментарий
2

[большой жирный комментарий, потому что комментарии не могут быть отформатированы хорошо)

Следуя инструкциям @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).

0

Не уверен, попробуйте:

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

  • 0
    Я попробовал это также - без какой-либо удачи.
  • 0
    urllib.urlopen () не принимает юникод. Вам нужно кодировать его в UTF-8, а затем избегать процентов - см. Ответ @Boaz Yaniv.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню