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

3

如何让Servlet接受从JSP传递的非ASCII字符(阿拉伯语、中文等)?

我尝试在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和Linux两个系统上都使用tomcat 5.0.28/6.x.x和JDK1.6。
以下是一个示例: 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个回答

8

简而言之,您需要设置请求编码

对于GET请求(其中参数通过请求URL传递),您需要在应用服务器级别进行配置。例如,在Tomcat 6.0中,只需将/conf/server.xml<Connector>元素的URIEncoding属性设置为UTF-8即可。

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

对于POST请求(其中参数是通过请求体“隐式”传递的),您需要在收集任何请求参数之前使用UTF-8调用ServletRequest#setCharacterEncoding()。最好的地方是在过滤器中进行此操作,该过滤器被称为链中的第一个过滤器:
if (request.getCharacterEncoding() == null) {
    request.setCharacterEncoding("UTF-8");
}
chain.doFilter(request, response);

1
哦,太感谢了,这正是我想要的。 我的问题是因为我发送了Get请求,而不是Post。 - Muhammad Hewedy
那么,难道没有编程(相对于可配置的)的方法来解决这个GET问题吗? - Muhammad Hewedy
你可以自己解析HttpServletRequest#getQueryString()。它不会被容器解码。为了更抽象化,你可以提供一个HttpServletRequestWrapper实现,对所有的getParameter()方法都执行这个操作。 - BalusC
你需要配置控制台以将字符输出为UTF-8。另请参阅http://balusc.blogspot.com/2009/05/unicode-how-to-get-characters-right.html#DevelopmentEnvironment(但要阅读整篇文章)。 - BalusC
这实际上是我的系统的问题! - Muhammad Hewedy
@BalusC 你好,我有同样的问题。我按照你关于POST方法的写法添加了代码,但仍然存在问题。这是我的问题链接:http://stackoverflow.com/questions/31448655/how-can-i-read-a-utf-8-value-in-my-servlet - yaylitzis

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

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


0

设置页面的内容类型是服务器与浏览器之间关于服务器发送内容的通信,但这并不会对您有太大帮助。您需要确保客户端与服务器之间的通信具有正确的字符编码,并且您的服务器正在使用正确的区域设置。您设置这些的精确方式取决于您使用的框架以及服务器的配置;首先要做的是确保在环境中使用正确的区域设置启动服务器(可能是LC_ALL变量)。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接