Tomcat 再次出现编码问题

Tomcat encoding issue again

Whosebug 上有很多关于这个主题的问题:

  1. Handling Character Encoding in URI on Tomcat
  2. Why the character is corrupted when use request.getParameter() in java?
  3. request.getParameter() does not display properly character encoding in java servlet
  4. Character encoding problems with tomcat

Tomcat Wiki 中也有一个 link 关于这个问题:http://wiki.apache.org/tomcat/FAQ/CharacterEncoding

所以我不知道我的问题应该写什么标题。也许你会帮我解决这一两个问题。

我遇到的问题:当带有西里尔字符的文本来自请求时,我得到以下请求参数值:to ÐÐ¸Ð·Ð½ÐµÑ Ð¸ ÑинанÑÑ.

所以我现在有什么:

  1. 所有 jsp 文件都有 UTF-8 编码,如下所示:
<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  1. 在 Eclipse->Preferances->General->Workspace->Text files encoding 设置为 UTF-8
  2. 数据库编码设置为:DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;

  3. \apache-tomcat-7.0.57\conf 文件夹 server.xml 中,其中一个连接器已修改为:

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

  1. 使用 doFilter 方法创建编码过滤器:

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest)request;
        String requestEncoding = request.getCharacterEncoding();
        if (requestEncoding == null) {
            request.setCharacterEncoding(encoding);
        }
        chain.doFilter(request, response);
    }
    

jsp 读取时,我还尝试以不同的方式获取参数,例如:

 <a href="<c:url value="controller?command=viewFaculty"> 
<c:param name="name" value="${faculty.name}"/> </c:url>">${faculty.name}</a>

<a href="<c:url value="controller?command=viewFaculty"> <c:param name="name" value="${faculty.name}"/>

而且我仍然得到这些丑陋的字符。你能帮我提点建议吗??

我解决了我的问题。问题是我编辑的不是原始 server.xml。我注意到 tomcat 已作为名为 Servers 的项目的书签出现在 Eclipse 项目资源管理器中。 还有一些文件就在他里面,比如:

  1. catalina.policy
  2. catalina.properties
  3. context.xml
  4. web.xml
  5. tomcat-users.xml
  6. server.xml

所以碰巧 tomcat 已经有了预配置的文件,我自己编辑的 \apache-tomcat-7.0.57\conf 文件夹中的文件 server.xml 与该项目中的文件不同。

在问题的开头,我已经将一些答案与这个问题联系起来,在我的 post 结尾,我想分享我最近发现的那个,在我看来这是最好的指南对于这个问题:How to get UTF-8 working in Java webapps?