2009-04-30 87 views
1

我有有一个全球化的标签设置C#.NET Web项目:获得U + FFFD/65533,而不是从查询字符串特殊字符

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

当这个URL Flash应用程序(你得到同样的问题,当你手动输入网址在浏览器中):c_product_search.aspx搜索=kjøkken(或者:??c_product_search-ASPX搜索= 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

回答

3

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

但是,当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编码你的所有网址)。但不适用于其他任何人...

  • 我可以带来的最坏的解决方案是用代码处理这个问题。如果默认解码没有工作,我们重新分析兼容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(俄语)等其他编码...

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

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

0

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

+0

好吧。在flash中有一个叫做escape的函数。我已经尝试过这一点,这没有什么区别。 另外,如果我只是手动将URL写入地址字段,我会遇到同样的问题。 – nitech 2009-04-30 09:57:56

+0

我们在我们的网站上做的是,根据客户的语言,我们有专门的ISO编码请求和响应。因为许多客户不了解UTF-16。这也是一种可能性。 – cRichter 2009-04-30 13:26:55

0

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

+0

你正在那里。看起来AS2和AS3之间的网址编码存在差异。我在AS2上做了一个很好的示例,但显然在AS3上,相同的示例编码方式不同。 这篇文章讲述了更多关于这个。但它不提供解决方案。 http://www.ultrashock.com/forums/actionscript/as3-escape-vs-as2-escape-122046.html – nitech 2009-05-06 06:38:30

+0

而且,如果超级论坛论坛将ø解码为U + fffd没有任何意义在说AS3使用ISO-8859-1进行编码时是正确的。 – nitech 2009-05-06 06:46:03

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

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