我有一个JavaScript请求,发送到一个ASP.Net(2.0)HTTP处理程序,该处理程序将请求传递给Java Web服务。在此系统中,特殊字符(例如带重音的字符)无法正确传递。
例如:
人类输入:
但是,
因此,该值未被正确解码或重新编码以传递给Java服务。
注意:
为什么会这样,并且我如何告诉
例如:
人类输入:
Düsseldorf
变成了一个JavaScript异步请求http://site/serviceproxy.ashx?q=D%FCsseldorf
,根据我所知,它在ISO-8859-1以及UTF-8中都是有效的。(除非它在UTF-8中是%c3%bc)
HttpContext.Current.Request.QueryString.Get("q")
返回D�sseldorf
,这就是问题开始的地方。但是,
HttpUtility.UrlEncode(HttpContext.Current.Request.QueryString.Get("q"), Encoding.GetEncoding("ISO-8859-1"))
返回D%3fsseldorf
(一个“?”),而HttpUtility.UrlEncode(HttpContext.Current.Request.QueryString.Get("q"), Encoding.UTF8)
返回D%ef%bfsseldorf
。因此,该值未被正确解码或重新编码以传递给Java服务。
注意:
HttpContext.Current.Request.Url.Query
为?q=D%FCsseldorf&output=json&from=1&to=10
,而HttpContext.Current.Request.QueryString.ToString()
为q=D%ufffdsseldorf&output=json&from=1&to=10
。为什么会这样,并且我如何告诉
HttpContext
尊重包括以下内容的请求标头:Content-Type=application/x-www-form-urlencoded;+charset=UTF-8
使用UTF-8字符集解码URL的QueryString
。
附加说明:正如答案所指出的那样,问题不在于解码而在于编码;在JavaScript中使用escape()
不会按照UTF-8进行转义,而使用encodeURIComponent()
则会。