【问题标题】:java tomcat utf-8 encoding issuejava tomcat utf-8编码问题
【发布时间】:2012-06-11 19:18:42
【问题描述】:

我正在使用 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,它存储了几个常量,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() 中的值时,也会发生同样的情况。在调试窗口中,我可以看到变量包含正确的字符,但我打印出来或尝试将其存储在数据库中,它是随机字符。

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

非常感谢。

【问题讨论】:

  • 我不明白您是否担心服务器控制台和日志上的输出损坏,或浏览器响应结果中的输出损坏。你能澄清一下吗?
  • System.getProperty("file.encoding")的值是多少?
  • 我担心的是在调试窗口中我可以看到正确的编码,但是当我将变量传递给我的数据库访问对象并将其存储到数据库时,它会变成随机字符。所以后来我发现在处理请求的方法中,即使简单的打印出UTF-8 Enum值也行不通。
  • 您怎么知道实际存储在数据库中的值是垃圾,而在从数据库中检索期间该值可能已损坏?

标签: java jsp tomcat utf-8 request


【解决方案1】:

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

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

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 的文件连接器元素具有值为 UTF-8 的 URIEncoding 属性。

<Connector port="8080" 
           protocol="HTTP/1.1"
           connectionTimeout="20000"
           URIEncoding="UTF-8"
           redirectPort="8443"/>

您还需要在每个 JSP 页面中指定这一点:

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

【讨论】:

  • 实际上,我认为您可以将其放在您的 JSP 中,而不是过滤器:&lt;%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%&gt;
  • Stijn de Witt 仅使用您的答案对我有用!没有使用任何过滤器。谢谢。
【解决方案2】:

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

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

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

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

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

您最好将值写入文件,然后使用十六进制编辑器检查内容以确保您获得了您正在寻找的字节值。

【讨论】:

猜你喜欢
  • 2017-07-30
  • 2013-11-12
  • 2014-10-13
  • 2018-04-21
  • 2018-02-16
  • 1970-01-01
  • 2010-12-01
  • 1970-01-01
相关资源
最近更新 更多