質問

グローバリゼーションタグが設定されたC#.net Webプロジェクトがあります:

<globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="nb-no" uiCulture="no"/>

このURLがFlashアプリケーションの場合(ブラウザーにURLを手動で入力すると同じ問題が発生します):c_product_search.aspx?search = kj <!>#248; kken(または:c_product_search-aspx?search = kj %F8kken

どちらも次の文字コードを返します:

k U+006b 107
j U+006a 106
� U+fffd 65533
k U+006b 107
k U+006b 107
e U+0065 101
n U+006e 110

文字エンコーディングについてあまり知りませんが、<!>#248;ユニコード置換文字が与えられましたよね?

グローバリゼーションタグを次のように変更しようとしました:

<globalization requestEncoding="iso-8859-1" responseEncoding="utf-8" culture="nb-no" uiCulture="no"/>

これでリクエストが機能しました。しかし、今、私のページの他の検索は機能しなくなりました。

同様の結果で次のことも試しました:

NameValueCollection qs = HttpUtility.ParseQueryString(Request.QueryString.ToString(), Encoding.GetEncoding("iso-8859-1"));
string search = (string)qs["search"];

どうすればよいですか?

よろしく、

nitech

役に立ちましたか?

解決

問題はFirefox / Asp.Netの組み合わせに起因しています。 FirefoxのアドレスバーにURLを手動で入力したときに、URLにフランス語またはスウェーデン語の文字が含まれている場合、FirefoxはURLを<!> quot; ISO-8859-1 <!> quot;でエンコードします。デフォルトで。

しかし、asp.netはそのようなURLを受信すると、utf-8でエンコードされていると考えます...そしてエンコードされた文字は<!> quot; U + fffd <!> quot;になります。 asp.netで、URLが<!> quot; ISO-8859-1 <!> quot;であることを検出する方法が見つかりませんでした。 Request.Encodingはutf-8に設定されています...:(

いくつかの解決策があります:

    Web.configで
  • put <globalization requestEncoding="iso-8859-1" responseEncoding="iso-8859-1"/>。しかし、あなたは他の問題を抱えているかもしれず、あなたのアプリケーションはもはや標準ではありません(日本語のような言語では動作しません)...そしてとにかく、UTF-8を使用することを好みます!

  • Firefoxのabout:configに移動し、network.standard-url.encode-query-utf8の値をtrueに設定します。これで動作します(FirefoxはすべてのURLをutf-8でエンコードします)。しかし、他の誰かのためではありません...

  • 私がやってきた中で最も最悪の解決策は、コードでこれを処理することでした。デフォルトのデコードが機能しなかった場合、iso8859-1でQueryStringを再解析します。

    string query = Request.QueryString["search"];
    if (query.Contains("%ufffd"))
        query = HttpUtility.ParseQueryString(Request.Url.Query, Encoding.GetEncoding("iso-8859-1"))["search"];
    query = HttpUtility.UrlDecode(query);
    

フランス語、英語、または日本語のハイパーリンクと手動で入力されたURLで動作します。しかし、ISO8859-5(ロシア語)のような他のエンコーディングをどのように処理するかわかりません...

より良い解決策はありますか?

これは、手動で入力したURLの問題のみを解決します。ハイパーリンクでは、サーバー上のHttpUtility.UrlEncodeでURLパラメーターをエンコードするか、JavaScriptコードでencodeURIComponentをエンコードすることを忘れないでください。 HttpUtility.UrlDecodeを使用してデコードします。

他のヒント

    public string GetEncodedQueryString(string key)
    {
        string query = Request.QueryString[key];
        if (query != null)
            if (query.Contains((char)0xfffd))
                query = HttpUtility.ParseQueryString(Request.Url.Query, Encoding.GetEncoding("iso-8859-1"))[key];
        return query;
    }

私はあなたの問題は.netではなくフラッシュにあると思います。 奇妙な方法で特殊文字を送信します。 サーバーに送信する前に検索文字列をurlencodeしてみてください。

アプリがURLエンコードされたリクエストがUTF-8に基づいていることを期待している場合、文字<!> quot; ø <!> quot; <!> quot; %C3%B8 <!> quot;ではなく、<!> quot; %F8 <!> quot;である必要があります。そのリクエストをエスケープ/エンコードするために使用している関数が何であれ、基本となる文字エンコーディングの名前<!> quot; UTF-8 <!> quot;。

を渡す必要があるでしょう。

ActionScript 3.0はISO-8859-1を使用しているのに対し、ActionScript 2.0はUTF-8でエンコード/エスケープされたURLを送信します。これを解決する方法は、URLでエンコードが指定されている場合、Global.asax内のRequest.Encoding値を変更することでした:

void Application_BeginRequest(object sender, EventArgs e)
{
    HttpContext ctx = HttpContext.Current;

    // encoding specified?
    if (!String.IsNullOrEmpty(Request["encoding"]))
    {
        ctx.Request.ContentEncoding = System.Text.Encoding.GetEncoding(ctx.Request["encoding"]);
    }        
}

異なる方法で行うことができますか?

よろしく、 nitech

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top