servlet得到?而是unicode字符(波斯语)

时间:2015-02-05 10:57:21

标签: java jsp servlets unicode utf-8

我有一个非常简单的html,其中包含一个提交按钮和一个文本框,该文本框将一个unicode(波斯语)文本发送到servlet并在weblogic上运行它。我在jsp页面中设置了charset = UTF-8和request.setCharacterEncoding(“UTF-8”);在servlet中,但是当我从请求获取参数并将其打印或插入数据库时​​,它是??? 我也使用URLDecoder,但它没有帮助。我怎么能解决这个问题? HTML代码:

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
     <html>
       <head>
       </head>
       <body>
        <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
        <fmt:requestEncoding value="UTF-8" /> 
        <form method="get" action="main"> 
        <input type="submit" name="search"  value="جستجو" >
        <input type="text" name="keyWord" class="bodyfont" >
    </form>
  </body>
</html>

servlet代码:

 request.setCharacterEncoding("UTF-8");
    String input =   URLDecoder.decode(request.getParameter("keyWord"), "UTF-8");
    System.out.println(input);
    System.out.println(request.getParameter("keyWord"));

1 个答案:

答案 0 :(得分:0)

 String input =   URLDecoder.decode(request.getParameter("keyWord"), "UTF-8");

该参数已由getParameter按位进行了URL解码,因此外部URLDecoder.decode()调用不会执行任何操作(可能会损坏实际值中的任何实际百分号)。

getParameter在内部调用URLDecoder时使用的编码是ISO-8859-1;上面对request.setCharacterEncoding的调用不会影响查询字符串解码。 (它只影响POSTed表单,即使那样,除非你在过滤器中调用它,否则它通常不会起作用。)

在Servlet规范中解决这种极端跛足有三种选择:

  1. 特定于容器的选项,用于配置不同的查询字符串编码,例如Tomcat中的<Connector URIEncoding>或Weblogic中的<java-charset-name>;

  2. 接受该参数被错误解码,并以其他方式错误编码:new String(request.getParameter("foo").getBytes("iso-8859-1"), "utf-8");

  3. 抓取request.getQueryString()并自己将其解析为单独的参数,然后从开始使用正确的编码进行URLDecode。这是更多的工作,但至少你可以让你的应用程序在人们做过的环境中一致地运行(1)。

  4.   

    System.out.println(input);

    这本身很麻烦。终端可能不支持Unicode(特别是在Windows下),或者Java可能没有正确设置其默认编码。如果Java认为System.out是ASCII或ISO-8859-1,那么它将无法打印任何波斯语,因此您将获得?。 Java无法检测到终端编码和丰富的ASCII,这是很常见的。

    可以使用-Dfile.encoding=...覆盖默认值,但是为整个容器设置这很烦人。如果您确定终端确实支持UTF-8,您可以尝试使用getBytesSystem.out.write手动编码为UTF-8字节,或者在System.out上创建新的PrintStream使用UTF-8作为编码。