代码之家  ›  专栏  ›  技术社区  ›  Vivin Paliath

JQuery与Java的编码问题

  •  3
  • Vivin Paliath  · 技术社区  · 14 年前

    我的编码设置为ISO-8859-1。

    我正在使用 jQuery.ajax 到一个servlet。URL(在jquery序列化之后)最终看起来如下:

    https://myurl.com/countryAndProvinceCodeServlet?action=getProvinces&label=%C3%85land+Islands

    实际标签值为 Åland Islands . 对于servlet,我收到的值是:

    Ã\u0085land Islands

    但这不是我想要的。我想把它解码成 陆地岛屿 . 我试过很多东西 scriptCharset ,尝试使用 getBytes() 但似乎没什么效果)。

    2 回复  |  直到 14 年前
        1
  •  6
  •   bobince    14 年前

    servlet规范的一个不幸部分是,用于解码查询参数的编码不能由servlet自己设置。相反,它留给服务器作为配置问题。

    这使得部署国际化网站变得非常困难,特别是因为servlet规范选择的默认编码不是最有用的UTF-8,而是ISO-8859-1。(实际的ISO-8859-1,甚至不是Windows代码页1252,这是编码浏览器将 真正地 要求使用ISO-8859-1时提交!)

    所以如何重新配置这是一个服务器问题。对于Tomcat,它需要 some fiddling with the server.xml .

    如果您没有访问服务器配置的权限,那么另一种方法是获取每个提交的参数名/值并对其重新编码。幸运的是,iso-8859-1保留了作为相同数字的unicode码位提交的每个字节,因此要将字符串转换为最初正确解释为utf-8的字符串,您可以使用iso-8859-1将每个字符串编码为字节数组,然后将字节解码回字符串u。使用UTF-8。当然,如果有人随后将服务器重新配置为使用UTF-8,则会出现问题…

        2
  •  4
  •   BalusC    14 年前

    波因斯已经详细地讲过了,所以我跳过这一部分。如果您真的无法控制容器管理的URI编码,那么最好的办法就是自己动手进行URI编码。可以通过以下方式在servlets中获取原始get查询字符串: HttpServletRequest#getQueryString() . 然后,使用UTF-8进行拆分和URL解码是一件很重要的事情 String 方法和 URLDecoder#decode() .

    for (String parameter : request.getQueryString().split("&")) {
        String[] pair = parameter.split("=");
        String name = URLDecoder.decode(pair[0], "UTF-8");
        String value = URLDecoder.decode(pair[1], "UTF-8");
        // ...
    }
    

    不用说,记住这不是一个解决方案,而是一个变通方案。