从查询字符串中获取U + fffd / 65533而不是特殊字符
我有一个C#.net web项目,其全球标记设置为:
当此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替换字符,对吧?
我试图将全球化标签更改为:
这使得请求工作。 但是,现在,我页面上的其他搜索停止了工作。
我也尝试了以下类似的结果:
NameValueCollection qs = HttpUtility.ParseQueryString(Request.QueryString.ToString(), Encoding.GetEncoding("iso-8859-1")); string search = (string)qs["search"];
我该怎么办?
亲切的问候,
nitech
问题来自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 … 🙁
有几种解决方案:
-
在您的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);
它适用于法语,英语或日语的超链接和手动输入的URL。 但我不知道它将如何处理ISO8859-5(俄语)等其他编码……
有没有人有更好的解决方案?
这仅解决了手动输入的URL的问题。 在您的超链接中,不要忘记使用服务器上的HttpUtility.UrlEncode编码url参数,或者使用javascript代码上的encodeURIComponent编码。 并使用HttpUtility.UrlDecode对其进行解码。
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; }
我认为你的问题是闪存,而不是.net。 它以奇怪的方式发送特殊字符。 尝试urlencode你发送到服务器的搜索字符串bellore。
如果应用程序期望URL编码的请求基于UTF-8,则字符“ ø
”应为“ %C3%B8
”,而不是“ %F8
”。 无论您使用什么函数来转义/编码该请求,您可能需要将基础字符编码的名称“UTF-8”传递给它。
事实certificate,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