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

servlet get ? instead unicode character(persian)

我有一个非常简单的 html,带有一个提交按钮和一个文本框,用于将 unicode(波斯语)文本发送到 servlet 并 运行 它在 weblogic 上。我在 jsp 页面和 request.setCharacterEncoding("UTF-8") 中设置了 charset=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"));
 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() 并自己将其解析为单独的参数,然后 URL从一开始就使用正确的编码进行解码。这是更多的工作,但至少您可以使您的应用程序 运行 在人们已经完成 (1) 的环境中保持一致。

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 字节,或者使用 UTF 在 System.out 上创建一个新的 PrintStream -8 作为编码。