Java 你得到了什么?而是unicode字符(波斯语)

Java 你得到了什么?而是unicode字符(波斯语),java,jsp,servlets,unicode,utf-8,Java,Jsp,Servlets,Unicode,Utf 8,我有一个非常简单的html,带有一个提交按钮和一个文本框,可以将unicode波斯语文本发送到servlet并在weblogic上运行。我在jsp页面和request.setCharacterEncodingUTF-8中设置了charset=UTF-8;在servlet中,但当我从请求中获取参数并打印它或将其插入数据库时,它是??? 我也使用URL解码器,但没用。我怎样才能解决这个问题? html代码: <%@ page contentType="text/html;charset

我有一个非常简单的html,带有一个提交按钮和一个文本框,可以将unicode波斯语文本发送到servlet并在weblogic上运行。我在jsp页面和request.setCharacterEncodingUTF-8中设置了charset=UTF-8;在servlet中,但当我从请求中获取参数并打印它或将其插入数据库时,它是??? 我也使用URL解码器,但没用。我怎样才能解决这个问题? 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>
getParameter已经为您对参数进行了URL解码,因此外部URLDecoder.decode调用除了可能损坏实际值中的任何实际百分比符号外,不会执行任何操作

getParameter在内部调用URLDecoder时使用的编码是ISO-8859-1;上面对request.setCharacterEncoding的调用不影响查询字符串解码。它只影响已发布的表单,即使这样,通常也不起作用,除非您在过滤器中调用它

Servlet规范中有三个选项可以解决这个极端的缺陷:

特定于容器的选项,用于配置不同的查询字符串编码,例如在Tomcat或Weblogic中

接受参数被错误解码,并以另一种方式对其进行错误编码:new Stringrequest.getParameterfoo.getBytesiso-8859-1,utf-8

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

System.out.printlinput

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


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

我测试了所有3种方法,但仍然打印???,我在过滤器中测试post和setCharacterEncoding.:添加了注释re System.out.非常感谢。它起作用了。我在独立java程序中检查终端,但这里它不能打印波斯语。我使用一个jsp文件来测试请求参数,并将其正确打印出来。再次感谢各位:
 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");