我有一个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
答案 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