5

我有一个JavaScript请求转到ASP.Net(2.0)HTTP处理程序,该处理程序将请求传递给java web服务。在这个系统中,特殊字符(如带有重音的字符)不能正确传递。使用.Net http处理程序编码变音符号时遇到问题

E.G.

  • 人力输入: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()

回答

6

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

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

如果UTF-8解码器看到非法字节序列0xFC,它会将其解码为Unicode“替换字符”U + FFFD,然后拾取它看到另一个有效字节序列开头的位置这个案子的''。

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

我相信你看到的是用ISO-8859-1编码的客户端,但服务器使用UTF-8进行解码。只要它碰到服务器,您的数据就会损坏。我建议您修改客户端以使用UTF-8编码;它应该是请求http://site/serviceproxy.ashx?q=D%C3%BCsseldorf

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

+0

在这里我正在寻找一种方法来告诉escape()我想使用UTF-8。我没有想到看encodeURIComponent()。另外我误解了UTF-8,并认为%FC可能对两者都有效。 – dlamblin 2008-11-26 16:43:26

1

当URL直接输入到IE8中时,我遇到了与ASP.NET通用处理程序相同的问题。人物正在通过发送为char 65533,但我确实有IE8设置为

[x] Send UTF-8 URLs.

我的方案,我调试在Visual Studio中的HTTP处理程序,并键入处理程序直接进入浏览器的地址:

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

然后单步执行代码。客户端将传递UTF-8编码的URL,但是在开发计算机上运行的IE8是客户端时有没有办法调试代码?