5

我有一个 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()会。

4

2 回答 2

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,所以您应该使用encodeURIandencodeURIComponent函数,而不是escape.

于 2008-11-26T01:00:12.927 回答
1

当 URL 直接输入 IE8 时,我遇到了与 ASP.NET 通用处理程序相同的问题。字符作为 char 65533 发送,但我确实将 IE8 设置为

[x] 发送 UTF-8 URL。

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

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

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

于 2010-01-21T19:59:39.160 回答