java tomcat utf-8编码问题

我正在使用java / jsp / tomcat / mysql开发一个简单的Web应用程序,最大的问题在于字符编码,因为我需要处理UTF-8编码而不是默认的8851。

首先,我想描述一下我的程序结构。 我正在使用一个名为Controller.java的Servlet来处理所有请求。 所以在web.xml中,我有一个Controller servlet,它接受来自* .do的所有请求。

然后,此Controller将根据请求的URL分派请求,例如,如果客户端要求register.do,Controller将把请求分派给Register.java。

在Register.java中,有一个方法将请求作为参数,即:

public String perform(HttpServletRequest request) { do something with the request... } 

所以问题是如果我想在这个方法中用UTF-8打印一些东西,它会给出随机字符。 例如,我有一个存储几个常量的枚举,其中一个属性是Enum在繁体中文中的名称。 如果我打印出来的话

 public static void main(Stirng[] args{ System.out.println(MyEnum.One.getChn()); logger.info(MyEnum.One.getChn()); } 

这是用中文正确打印的。 但是,如果我将确切的代码放在处理HttpServletRequest的方法中:

 public String perform(HttpServletRequest request) { System.out.println(MyEnum.One.getChn()); logger.info(MyEnum.One.getChn()); } 

它们作为随机字符打印,但我可以从调试窗口(eclipse)看到变量保存正确的中文字符。

因此,当我想存储来自request.getParameter()的值时,会发生同样的情况。 在调试窗口中,我可以看到变量保存了正确的字符,但我将其打印出来或尝试将其存储在数据库中,它是随机字符。

我不知道为什么行为会像这样,这阻止我阅读提交的表单值并将它们存储到数据库中。 有人可以给出一些暗示吗?

万分感谢。

如果你需要使用UTF-8编码(实际上,现在每个人都应该这样做),那么你可以按照Tomcat常见问题解答中的“UTF-8无处不在”进行操作:

http://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q8

请记住,您还需要在数据库的文本字段中支持UTF-8。

还要记住,有时将带有非ASCII字符的字符串“打印”到日志文件或控制台可能会受到影响

  1. 输出流的字符编码
  2. 文件阅读器的字符编码(例如cat / less / vi)
  3. 终端的字符编码

您可能最好将值写入文件,然后使用hex编辑器检查内容,以确保获得所需的字节值。

这是一个小教程,您需要做些什么才能使UTF-8在您的Web应用程序中运行:

您必须在应用程序中实现Filter以进行字符编码:

 public class CharacterEncodingFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { servletRequest.setCharacterEncoding("UTF-8"); servletResponse.setContentType("text/html; charset=UTF-8"); filterChain.doFilter(servletRequest, servletResponse); } @Override public void destroy() { } } 

您必须确保tomcat的server.xml的文件连接器元素具有URIEncoding属性,该属性的值为UTF-8。

  

您还需要在每个JSP页面中指定它:

 <%@page contentType="text/html" pageEncoding="UTF-8"%>