Eclipse / Spring / Tomcat 6的奇怪字符编码问题

时间:2011-01-04 16:27:00

标签: java eclipse spring jsp character-encoding

我一整天都在尝试,但无法找到合适的解决方案。我的问题是:我正在我的本地Tomcat中开发一个基于Spring MVC的应用程序。我的MySQl数据库设置了UTF-8个编码器,使用phpMyAdmin时,其中的所有内容都正确显示。在catalina.out中使用log4j的LOG文件中的输出也可正常工作。

我的JSP页面由

配置
<!-- encoding -->
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ page pageEncoding="UTF-8" %>

同样在我的JSP上显示数据工作正常。我也可以使用特殊字符从控制器发送数据而不会有任何数据库干扰,例如

String str = "UTF-8 Test: Ä Ö Ü ß è é â";
logger.debug(str);
mav.addObject("utftest", str);

在日志和浏览器的jsp页面上正确显示

但是:在我的JSP文件中直接使用特殊字符时,例如对于标题中的文本,这不起作用。 FF和谷歌浏览器显示奇怪的字符,但报告页面为UTF-8。当切换到拉丁语时,字符变得越来越奇怪。

在我的messages.properties文件中显示文本标记时遇到同样的问题,虽然Eclipse在右键单击时会说明将使用UTF-8。

我有点迷路,现在不知道在哪里检查。

要点:

  • 数据库存储很好
  • JSP上的DB输出很好
  • 直接在JSP上输出控制器很好
  • 即使以表格形式阅读也很好
  • .properties文件和JSP文本不正确 !!!

有什么想法吗?我真的很感激和提示。

5 个答案:

答案 0 :(得分:6)

任务

我遇到了与你的完全相同的问题,配置非常相似(Tomcat,Spring,Spring Web Flow,JSF2)。

关于我自己调查的一些事实:

  • Tomcat Window下的WAR:编码问题,
  • Tomcat Linux下的相同WAR:没问题→怀疑操作系统默认编码,因为Linux是UTF-8,
  • 在Windows上由Eclipse WTP运行的Tomcat下的相同WAR:没问题→WTF?!
  • 使用自然拉丁字符而不是unicode占位符传递UTF-8中的属性文件:解决外部化标签的问题,
  • Faceli(JSF2页面)中的
  • 相同:总是遇到问题,只有工作是<f:verbatim>&amp;eacute;</f:verbatim>

在检查了我在论坛上找到的经典先决条件和推荐的所有代码之后仍然遇到问题:

  • <?xml version="1.0" encoding="UTF-8" ?>位于XML文件的顶部,
  • <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />位于相同文件的HTML标头内
  • {li> encoding="UTF-8" <f:view>

Tomcat的配置在以下方面没有做任何事情:

  • server.xml 中的连接器上的URIEncoding =“UTF-8”(正常,因为它涉及URI编码而非页面编码)
  • org.springframework.web.filter.CharacterEncodingFilter开启和关闭,
  • 也是(我可能错过了这里的观点):

    <locale-encoding-mapping-list>
      <locale-encoding-mapping>
        <locale>fr</locale>
        <encoding>UTF-8</encoding>
      </locale-encoding-mapping>
    </locale-encoding-mapping-list>
    

我找到了比较WTP和经典命令行MS-DOS Tomcat启动之间的Tomcat命令行的解决方案。唯一的区别是参数-Dfile.encoding=UTF-8。这是解决问题的关键。

设置JAVA_OPTS = -Dfile.encoding =“UTF-8”并且工作正常。

(尝试)解释

我发现的唯一解释是,Tomcat使用JVM编码,默认情况下是系统编码(Linux上为UTF-8,Windows上为CP1252)。 Eclipse WTP根据其工作空间编码设置强制JVM编码。以UTF-8传递JVM提供了解决方案。

我怀疑它不是真正合适的,并且我的堆栈上或者通过 maven-resources-plugin maven-war-plugin进行的资源过滤都存在配置问题,但我还没有找到它。

答案 1 :(得分:4)

您需要配置Eclipse以将文件保存为UTF-8。

转到窗口&gt;首选项,在顶部输入过滤器文本encoding,浏览所有部分以将所有内容设置为UTF-8。特别是对于JSP文件,这是在 Web&gt; JSP文件&gt;编码。选择最顶端的UTF-8选项(称为“ISO 10646 / Unicode(UTF-8)”)。

对于属性文件,这是一个独立的故事。根据规范,它们默认为ISO-8859-1。您需要native2ascii工具或提供使用UTF-8的自定义本地文件加载器。有关更多详细信息,请参阅this article

答案 2 :(得分:4)

正如BalusC所说,你必须以utf-8格式保存文件。

要解决附加文件的其他问题,只需添加标题

即可

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

位于每个包含文件的顶部。这告诉servlet将文件视为UTF-8编码,而不是使用默认的ISO-8859-1。

答案 3 :(得分:2)

我正在使用带有Spring框架的Tomcat 7并在JSP中使用<jsp:include page="anyFile.html"/>失败并给我一个java.lang.IllegalStateException。如果我想包含另一个JSP文件而不是静态HTML文件,<jsp:include>可以正常工作,但是当我尝试注入静态HTML文件时,它会继续给我这个与字符编码相关的异常。

使用<jsp:directive.include file="anyFile.html" /><%@include file="anyFile.html"%>可以使用,但所有特殊字符(“é”,“è”,“ç”等)都会被编码到ISO-8891而不是UTF-8中,即使JSP文件中包含<%@page contentType="text/html" pageEncoding="UTF-8"%><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

我通过使用带有导入标记的JSLT标记库找到了解决方案:

  1. 把它放到JSP中: <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

  2. 然后使用以下内容获取我要包含的HTML文件: <c:import url="anyFile.html" charEncoding="UTF-8"/>

  3. 您是否可以看到JSLT库中的import标记具有charEncoding属性,该属性可以将html文件设置为适当的字符编码并正确显示其内容。

答案 4 :(得分:0)

对于JSP,请参阅@BalusC。

有关属性文件,请参阅:http://download.oracle.com/javase/1.4.2/docs/api/java/util/Properties.html

  

将属性保存到流或从流中加载它们时,   使用ISO 8859-1字符编码。对于不能的角色   在此编码中直接表示,使用Unicode转义;   但是,在转义序列中只允许使用一个“u”字符。   native2ascii工具可用于将属性文件转换为和   来自其他角色编码。