URIをエンコードするために使用urllib.quote("schönefeld")
しましたが、ASCII以外の文字が文字列に存在する場合、thorwsします
KeyError: u'\xe9'
Code: return ''.join(map(quoter, s))
私の入力文字列はköln, brønshøj, schönefeld
etc.
Windowsでステートメントを印刷しようとしたとき(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 のすべての要素に対して、quoter 関数が呼び出され、最後にリストが '' で結合されて返されます。
非 ascii charè
の場合、同等のキーは%E8
which presents in _safe_map
variable になります。しかし、quote('è') を呼び出すと、 key が検索されます\xe8
。キーが存在せず、例外がスローされるようにします。
そのため、try-except ブロック内でs = [el.upper().replace("\\X","%") for el in s]
呼び出す前に変更しました。''.join(map(quoter, s))
今では正常に動作します。
しかし、私がやったことは正しいアプローチですか、それとも他の問題が発生しますか? また、Linux のインスタンスが 200 以上あるため、すべてのインスタンスにこの修正を展開するのは非常に困難です。