如何在Servlet中启用读取非ascii字符

Muh*_*edy 3 unicode jsp servlets character-encoding

如何使servlet接受从JSP传递的非ascii(阿拉伯语,中文等)字符?

我试图将以下内容添加到JSP的顶部:

<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
Run Code Online (Sandbox Code Playgroud)

并在servlet中的每个post/get方法中添加以下内容:

request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
Run Code Online (Sandbox Code Playgroud)

我试图添加一个Filter来执行上面两个语句而不是servlet.

说实话,过去这些都在起作用,但现在它不再起作用了.

我在Win和Linux机器上的JDK1.6上使用tomcat 5.0.28/6.xx.

这是一个例子:JSP页面:

<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
<title>Push Engine</title>
</head>
<body>
Hello ${requestScope['val']}
<form action="ControllerServlet" method="POST">
<table>
    <tr>
        <td>ABC</td>
        <td><input name="ABC" type="text" /></td>
    </tr>
    <tr>
        <td></td>
        <td><input type="submit" value="Submit"></td>
    </tr>
</table>
</form>

</body>
</html>
Run Code Online (Sandbox Code Playgroud)

Servlet doGet方法:

protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        String val = "request.getParameter('ABC') : " + request.getParameter("ABC");
        System.out.println(val);
        request.setAttribute("val", val);
        request.getRequestDispatcher("index.jsp").forward(request, response);
    }
Run Code Online (Sandbox Code Playgroud)

问题是: 在控制台中,值"???" 然而,正在打印的值返回到包含正确Unicode字的JSP页面

"???" 打印到控制台是我运行此测试的机器中的问题.我在另一台机器上运行了同样的例子,它运行正常!

Bal*_*usC 8

至此,您需要设置请求编码.

对于GET请求(其中参数通过请求URL传递),您需要在appserver级别配置它.例如,在Tomcat 6.0中,只需URIEncoding<Connector>元素的属性设置/conf/server.xmlUTF-8.

<Connector (...) URIEncoding="UTF-8" />
Run Code Online (Sandbox Code Playgroud)

对于POST请求(其中的参数是"看不见",通过请求体传递),你需要调用ServletRequest#setCharacterEncoding()UTF-8 之前收集的任何请求参数.最好的地方是这样做是在一个过滤器,它被称为链中的第一个过滤器:

if (request.getCharacterEncoding() == null) {
    request.setCharacterEncoding("UTF-8");
}
chain.doFilter(request, response);
Run Code Online (Sandbox Code Playgroud)