を投げる私はurllib.quote("schönefeld")
を使用しますが、いくつかの非ASCII文字が文字列に存在する場合、それは私の入力文字列があるurllib.quote()は、URIをエンコードするにはKeyError例外
KeyError: u'\xe9'
Code: return ''.join(map(quoter, s))
thorwsなどköln, brønshøj, schönefeld
とき私は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))
でthrowinされています。
urllibは内のコードは次のとおりです。例外の理由が''.join(map(quoter, s))
である
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))
、s内のすべての要素のために、クォータ機能が呼び出され、最終的にはリストは「で参加しました」と返されます。
非ASCII文字の場合è
の場合、同等のキーは%E8
で、_safe_map
という変数になります。しかし、引用符( 'è')を呼び出すと、キー\xe8
が検索されます。キーが存在せず、例外がスローされるようにします。
したがって、try-exceptブロック内で''.join(map(quoter, s))
を呼び出す前にs = [el.upper().replace("\\X","%") for el in s]
を変更したばかりです。今それは正常に動作します。
しかし、私が行ったことは正しいアプローチですか、それとも他の問題を引き起こすでしょうか? また、すべてのインスタンスでこの修正プログラムを展開するのが非常に難しい200以上のLinuxインスタンスがあります。
このPython 2はユニコード値ですか?既にエンコードされたデータに対しては正常に動作します。 –
あなたは 'urllib.quote( 'sch \ xe9nefeld')'に対してエラーを出さず*しません。あなたは 'urllib.quote(u'sch \ xe9nefeld ')'(unicodeリテラルに注意してください)のエラーだけを取得します。 –
@MartijnPietersだから 'cmdString =" http:// baseurl "+ quote("schönefeld ")' cmdString = u "http:// baseurl" + quote(u "schönefeld") 'のようになりますか? – Garfield