我有一个 JavaScript 请求到一个 ASP.Net (2.0) HTTP 处理程序,该处理程序将请求传递给一个 java web 服务。在此系统中,特殊字符(例如带有重音符号的字符)无法正确传递。
例如
- 人工输入:
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
QueryString
并使用 UTF-8 字符集解码 URL 。
附录:正如答案所指出的,问题不在于解码,而在于编码;using escape()
in JavaScript 不会根据 UTF-8 转义,而 usingencodeURIComponent()
会。