代码之家  ›  专栏  ›  技术社区  ›  dlamblin

无法在.Net http处理程序中使用对u umlaut进行编码

  •  5
  • dlamblin  · 技术社区  · 16 年前

    我向ASP.Net(2.0)HTTP处理程序发送了一个JavaScript请求,该处理程序将请求传递给JavaWeb服务。在这个系统中,特殊字符(例如带有重音的字符)无法正确传递。

    • 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 (a“?”)
    • HttpUtility.UrlEncode(HttpContext.Current.Request.QueryString.Get("q"), Encoding.UTF8) 返回 D%ef%bfsseldorf

    • 注意 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
    

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

    附录:正如答案所指出的,问题不在于解码,而在于编码;使用 escape() encodeURIComponent()

    2 回复  |  直到 9 年前
        1
  •  6
  •   erickson    16 年前

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

    如果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,所以应该使用 encodeURI encodeURIComponent 功能,而不是 escape .

        2
  •  1
  •   Tim    15 年前

    当URL直接输入到IE8中时,ASP.NET通用处理程序也会遇到同样的问题。字符以字符65533的形式发送,但我将IE8设置为

    [x] Send UTF-8 URLs.

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

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