1

我有一个 C# .net web 项目,它的全球化标签设置为:

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

当这个 URL 是 Fl​​ash 应用程序时(在浏览器中手动输入 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

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

但是当asp.net收到这样的url时,它认为它是utf-8编码的......并且编码的字符变成了“U+fffd”。我在 asp.net 中找不到检测 url 是“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 对您的所有 url 进行编码)。但不是给别人...

  • 我能想到的最糟糕的解决方案是用代码处理这个问题。如果默认解码不起作用,我们使用 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);
    

它适用于法文、英文或日文的超链接和手动输入的网址。但我不知道它将如何处理其他编码,如 ISO8859-5(俄语)......

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

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

于 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

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

于 2009-05-04T14:10:44.830 回答
0

我认为您的问题出在闪存上,而不是.net。它以一种奇怪的方式发送特殊字符。尝试在将搜索字符串发送到服务器之前对其进行 urlencode。

于 2009-04-30T09:50:13.963 回答
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"]);
    }        
}

可以做得不同吗?

问候, 尼泰克

于 2009-05-19T12:45:34.930 回答