クエリ文字列から特殊文字の代わりにU + fffd / 65533を取得する
-
03-07-2019 - |
質問
グローバリゼーションタグが設定された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