2

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」に戻すために私がしなければならないことを誰かが提案できますか?

4

1 に答える 1

1

逆の順序で行います。最初に引用符を外し、次に.decode('utf-8')

バイトとUnicode文字列を混在させないでください。

import urllib

q = "Eptisa+Servicios+de+Ingenier%C3%ADa+S.L."
b = urllib.unquote_plus(q)
u = b.decode("utf-8")
print u

注:print uUnicodeEncodeErrorが発生する可能性があります。それを修正するには:

print u.encode(character_encoding_your_console_understands)

またはPYTHONIOENCODING、環境変数を設定します。

locale.getpreferredencoding()Unixでは文字エンコードとして試すことができます。Windowsでは次の出力を参照してください。chcp

于 2013-01-10T05:04:39.790 に答える