【问题标题】:servlet get ? instead unicode character(persian)小服务程序获取?而是 unicode 字符(波斯语)
【发布时间】:2015-02-05 10:57:21
【问题描述】:

我有一个非常简单的 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"));

【问题讨论】:

    标签: java jsp servlets unicode utf-8


    【解决方案1】:
     String input =   URLDecoder.decode(request.getParameter("keyWord"), "UTF-8");
    

    getParameter 已经为您对参数进行了 URL 解码,因此外部的 URLDecoder.decode() 调用什么也不做(除了可能损坏实际值中的任何实际百分号)。

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

    在 Servlet 规范中,有三个选项可以解决这种极端的跛行问题:

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

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

    3. 获取 request.getQueryString() 并自己将其解析为单独的参数,然后从一开始就使用正确的编码进行 URLDecode。这是更多的工作,但至少您可以让您的应用在人们已经完成的环境中始终如一地运行 (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-8 作为编码在 System.out 上创建一个新的 PrintStream。

    【讨论】:

    • 我测试了所有 3 种方法,但仍然打印 ????,我在过滤器中测试帖子和 setCharacterEncoding。 :(
    • 添加了关于 System.out 的注释。
    • 非常感谢。有用。我在独立的 java 程序中检查终端,但在这里它无法打印波斯语。我使用一个 jsp 文件来测试请求参数并正确打印它。再次感谢你:)
    猜你喜欢
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    • 2017-02-27
    • 2017-12-03
    相关资源
    最近更新 更多