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

时间:2010-04-13 15:16:23

标签: jsp unicode servlets character-encoding

如何让servlet接受从JSP传递的非ascii(Arabian,chines等)字符?

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

<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

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

request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");

我尝试添加一个执行上述两个语句而不是servlet的过滤器。

说实话,这些过去是有效的,但现在它不再起作用了。

我在Win&amp; amp;和JDK1.6上使用tomcat 5.0.28 / 6.x.x Linux盒子。

这是一个例子: 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>

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);
    }

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

的JSP页面

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

3 个答案:

答案 0 :(得分:8)

到目前为止,您需要设置request encoding

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

<Connector (...) URIEncoding="UTF-8" />

对于POST请求(其中参数“无形地”通过请求正文),您需要在收集任何请求参数之前使用UTF-8 调用ServletRequest#setCharacterEncoding()。最好的地方是在一个过滤器中,它被称为链中的第一个过滤器:

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

答案 1 :(得分:0)

设置页面的内容类型是从服务器到浏览器的通信,关于服务器发送它的内容,这对你没什么帮助。您需要确保的是,您的客户端到服务器通信具有正确的字符编码,并且您的服务器使用正确的语言环境运行。您设置的精确方式取决于您使用的框架以及服务器的配置方式;首先要做的是确保您的服务器在环境中使用正确的区域设置启动(可能是LC_ALL变量)。

请注意,客户端可能会尝试告诉您的服务器它想要的区域设置,这是您的框架可能会帮助您的东西。 (它是HTTP请求中的标头。)

答案 2 :(得分:0)

if (request.getCharacterEncoding() == null) {     request.setCharacterEncoding("UTF-8"); }

这对我有用。 我在JSP META标记中设置了charset = UTF-8,并在servlet中添加了上面的代码。 在此之后,它已在Oracle数据库中正确保存了阿拉伯语数据