Makoテンプレートに次のコードがあります。
<a href="#" onclick='getCompanyHTML("${fund.investments[inv_name].name | u}"); return false;'>${inv_name}</a>
これは、会社を表すオブジェクトの名前文字列にURLエスケープを適用します。結果のエスケープされた文字列は、URLで使用されます。Makoのドキュメントには、URLエンコードはを使用して提供されると記載されていurllib.quote_plus(string.encode('utf-8'))
ます。
サーバー上で、引数に会社名の部分を受け取りますinvestment_name
。
def Investment(client, fund_name, investment_name, **kwargs):
client = urllib.unquote_plus(client)
fund_name = urllib.unquote_plus(fund_name)
investment_name = urllib.unquote_plus(investment_name)
次に、investment_nameを、テンプレートで抽出されたのと同じ辞書へのキーとして使用します。
これは、会社名のスペース、スラッシュ、一重引用符など、すべての標準的なケースで問題なく機能します。ただし、会社名にASCII文字セット以外のUnicode文字が含まれている場合は失敗します。
たとえば、会社名「EptisaServiciosdeIngenieríaSL」のURLは、「Eptisa + Servicios + de + Ingenier%C3%ADa + SL」としてレンダリングされます。この値がサーバーに戻ってくると、エスケープするURLを元に戻しますが結果を辞書キーとして使用しようとするとキーエラーが発生するため、Unicodeを正しくデコードできないことは明らかです。
運が悪かったので、これら2つの形式でUnicodeデコードを追加しようとしました。
investment_name = urllib.unquote_plus(investment_name.decode('utf-8'))
investment_name = urllib.unquote_plus(investment_name.encode('raw_unicode_escape').decode('utf-8'))
「Eptisa+Servicios + de + Ingenier%C3%ADa + SL」を「EptisaServiciosdeIngenieríaSL」に戻すために私がしなければならないことを誰かが提案できますか?