在 .Net http 处理程序中编码 u 带分音符的字符出现问题

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

使用UTF-8字符集解码URL的QueryString

附加说明:正如答案所指出的那样,问题不在于解码而在于编码;在JavaScript中使用escape()不会按照UTF-8进行转义,而使用encodeURIComponent()则会。

2个回答

7

我不知道你的服务器(IIS?)使用的默认字符编码是什么,或者是否可以更改,但我可以告诉你一些可能有帮助的事情。

0xFC是ü的ISO-8859-1编码。虽然Unicode代码点是U+00FC,但在使用UTF-8编码时,这需要两个字节,并变为0xC3 0xBC。

如果UTF-8解码器看到非法字节序列0xFC,则会将其解码为Unicode“替换字符”U+FFFD,并从它看到另一个有效字节序列的开头开始,即's'。

你得到%3f的原因是'?'是拉丁字符集的“替换字符”,类似于Unicode字符集中的�。

我认为你看到的是客户端使用ISO-8859-1进行编码,但服务器使用UTF-8进行解码。一旦它到达服务器,你的数据就被破坏了。我建议你修改客户端以使用UTF-8编码;它应该请求http://site/serviceproxy.ashx?q=D%C3%BCsseldorf

听起来你正在使用JavaScript构建这些URL,所以你应该使用encodeURIencodeURIComponent函数,而不是escape


我一直在寻找一种方法告诉escape()我想使用UTF-8,但我没有想到要查看encodeURIComponent()。此外,我误解了UTF-8,并认为%FC可能对两者都有效。 - dlamblin

1
我在使用ASP.NET通用处理程序时遇到了同样的问题,当在IE8中直接输入URL时,字符会作为char 65533发送,但是我已经将IE8设置为

[x]发送UTF-8 URL。

在我的场景中,我正在使用Visual Studio调试HTTP处理程序,并直接在浏览器中输入处理程序的地址:

 http://localhost/myHandler.ashx?term=xxxxxx

然后逐步执行代码。客户端将传递UTF-8编码的URL,但是在开发机器上运行IE8作为客户端时,有没有一种方法来调试代码?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接