1

グローバリゼーションタグが次のように設定されているC#.netWebプロジェクトがあります。

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

このURLがFlashアプリケーションの場合(ブラウザに手動でURLを入力した場合も同じ問題が発生します):c_product_search.aspx?search =kjø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

文字エンコードについてはよくわかりませんが、øにはUnicode置換文字が付けられているようですよね?

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

<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"];

私は何をすべきか?

敬具、

ニテック

4

5 に答える 5

3

The problem comes from the combination Firefox/Asp.Net. When you manually entered a URL in Firefox's address bar, if the url contains french or swedish characters, Firefox will encode the url with "ISO-8859-1" by default.

But when asp.net recieves such a url, it thinks that it's utf-8 encoded ... And encoded characters become "U+fffd". I couldn't find a way in asp.net to detect that the url is "ISO-8859-1". Request.Encoding is set to utf-8 ... :(

Several solutions exist :

  • put <globalization requestEncoding="iso-8859-1" responseEncoding="iso-8859-1"/> in your Web.config. But your may comme with other problems, and your application won't be standard anymore (it will not work with languages like japanese) ... And anyway, I prefer using UTF-8 !

  • go to about:config in Firefox and set the value of network.standard-url.encode-query-utf8 to true. It will now work for you (Firefox will encode all your url with utf-8). But not for anybody else ...

  • The least worst solution I could come with was to handle this with code. If the default decoding didn't work, we reparse QueryString with iso8859-1 :

    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);
    

It works with hyperlinks and manually-entered url, in french, english, or japanese. But I don't know how it will handle other encodings like ISO8859-5 (russian) ...

Does anyone have a better solution ?

This solves only the problem of manually-entered url. In your hyperlinks, don't forget to encode url parameters with HttpUtility.UrlEncode on the server, or encodeURIComponent on the javascript code. And use HttpUtility.UrlDecode to decode it.

于 2009-10-02T13:42:16.650 に答える
1
    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;
    }
于 2011-07-01T19:17:40.243 に答える
0

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

于 2009-04-30T09:50:13.963 に答える
0

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

于 2009-05-04T14:10:44.830 に答える
0

ActionScript 3.0はISO-8859-1を使用しているのに対し、ActionScript2.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

于 2009-05-19T12:45:34.930 に答える