从查询字符串中获取U + fffd / 65533而不是特殊字符

时间:2009-04-30 09:39:08

标签: c# .net flash encoding url-encoding

我有一个C#.net网络项目,其全球标记设置为:

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

我该怎么办?

亲切的问候,

nitech

5 个答案:

答案 0 :(得分:3)

问题来自Firefox / Asp.Net的组合。当您在Firefox的地址栏中手动输入URL时,如果URL包含法语或瑞典语字符,Firefox将默认使用“ISO-8859-1”对URL进行编码。

但是当asp.net收到这样的网址时,它会认为它是utf-8编码的...并且编码后的字符会变成“U + fffd”。我在asp.net中找不到一种方法来检测网址是“ISO-8859-1”。 Request.Encoding设置为utf-8 ... :(

存在多种解决方案:

  • <globalization requestEncoding="iso-8859-1" responseEncoding="iso-8859-1"/>放入您的Web.config中。但你可能会认同其他问题,你的应用程序将不再是标准(它不适用于像日语这样的语言)......无论如何,我更喜欢使用UTF-8!

  • 在Firefox中转到about:config并将network.standard-url.encode-query-utf8的值设置为true。它现在适合你(Firefox将使用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(俄语)......

有没有人有更好的解决方案?

这只解决了手动输入网址的问题。在您的超链接中,不要忘记使用服务器上的HttpUtility.UrlEncode编码url参数,或者使用javascript代码上的encodeURIComponent编码。并使用HttpUtility.UrlDecode对其进行解码。

答案 1 :(得分: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;
    }

答案 2 :(得分:0)

我认为你的问题是在闪存中,而不是.net。 它以奇怪的方式发送特殊字符。 尝试将您发送到服务器的搜索字符串urlencode。

答案 3 :(得分:0)

如果应用期望网址编码的请求基于UTF-8,则字符“ø”应为“%C3%B8”,而不是“%F8”。无论您使用什么函数来转义/编码该请求,您可能需要将基础字符编码的名称“UTF-8”传递给它。

答案 4 :(得分:0)

事实证明,ActionScript 2.0将使用UTF-8发送编码/转义的URL,而ActionScript 3.0则使用ISO-8859-1。解决此问题的方法是,如果在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