Чтобы закодировать URI, я использовал urllib.quote("schönefeld")
, но когда в строке присутствуют некоторые символы, отличные от ascii, он поддерживает
KeyError: u'\xe9'
Code: return ''.join(map(quoter, s))
Мои строки ввода köln, brønshøj, schönefeld
и т.д.
Когда я пробовал просто печатать заявления в окнах (с использованием python2.7, pyscripter IDE). Но в Linux он вызывает исключение (я думаю, платформа не имеет значения).
Вот что я пытаюсь:
from commands import getstatusoutput
queryParams = "schönefeld";
cmdString = "http://baseurl" + quote(queryParams)
print getstatusoutput(cmdString)
Изучение причины проблемы:
в urllib.quote()
, на самом деле исключение выбрано в return ''.join(map(quoter, s))
.
Код в urllib:
def quote(s, safe='/'):
if not s:
if s is None:
raise TypeError('None object cannot be quoted')
return s
cachekey = (safe, always_safe)
try:
(quoter, safe) = _safe_quoters[cachekey]
except KeyError:
safe_map = _safe_map.copy()
safe_map.update([(c, c) for c in safe])
quoter = safe_map.__getitem__
safe = always_safe + safe
_safe_quoters[cachekey] = (quoter, safe)
if not s.rstrip(safe):
return s
return ''.join(map(quoter, s))
Причиной исключения является ''.join(map(quoter, s))
, для каждого элемента из s будет вызываться функция-циферблат, и, наконец, список будет соединен с символом '' и возвращен.
Для non-ascii char è
эквивалентный ключ будет %E8
, который представлен в переменной _safe_map
. Но когда я вызываю цитату ('è'), она ищет ключ \xe8
. Так что ключ не существует и исключение выбрано.
Итак, я просто модифицировал s = [el.upper().replace("\\X","%") for el in s]
перед вызовом ''.join(map(quoter, s))
в блоке try-except. Теперь он отлично работает.
Но я раздражаю то, что я сделал, это правильный подход или он создаст любую другую проблему? А также у меня есть 200+ экземпляров Linux, которые очень сложно развернуть это исправление во всех случаях.