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

3

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

我的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和Google Chrome显示奇怪的字符,但报告页面为UTF-8。 当切换到拉丁文时,字符变得越来越奇怪。

从我的messages.properties文件显示文本令牌时也存在同样的问题,尽管Eclipse在右键单击时表示将使用UTF-8。

我有点迷失方向,不知道现在该去哪里检查。

总结:

  • DB存储正常
  • 在JSP上的DB输出正常
  • 来自控制器的直接JSP输出正常
  • 即使从表单中读取也正常
  • properties文件和JSP文字 有问题 !!!

有任何想法吗? 我真的很感激和提示。

5个回答

6

探索

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

以下是我的研究中发现的一些细节:

  • 在Tomcat窗口下运行的WAR文件:出现编码问题,
  • 在Tomcat Linux环境下运行的同一个WAR文件:没有问题 → 可能是因为Linux默认使用UTF-8编码,
  • 在Windows上由Eclipse WTP运行的同一个WAR文件下没有问题 → 什么鬼?!
  • 将属性文件以UTF-8编码且包含自然的拉丁字符而不是Unicode占位符传递:可以解决外部化标签的问题,
  • 在Facelets(JSF2页面)中也会出现相同的问题,唯一有效的方法就是使用<f:verbatim>&amp;eacute;</f:verbatim>

尽管已经检查了我的代码,确保满足论坛上的经典先决条件和建议,但仍然存在这个问题:

  • XML文件开头添加<?xml version="1.0" encoding="UTF-8" ?>
  • 在同样的文件中HTML头部添加<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  • <f:view>中添加encoding="UTF-8"

以下Tomcat配置也没有起到任何作用:

  • URIEncoding="UTF-8" on connector in server.xml (normal because it concerns URI encoding not page encoding)
  • org.springframework.web.filter.CharacterEncodingFilter on and off,
  • also that (I presumably miss the point here):

    <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编码。将JVM设置为UTF-8即可解决问题。

我怀疑这并不是真正的解决方案,可能是我的堆栈或由maven-resources-pluginmaven-war-plugin进行的资源过滤配置问题,但我还没有找到它。


4

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

为了解决您的其他问题(关于包含文件),只需在每个包含文件的顶部包含以下头文件:

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

这告诉servlet将文件视为UTF-8编码,而不是使用默认的ISO-8859-1编码。


3

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

进入窗口 > 首选项,在顶部输入筛选文本encoding,浏览所有部分并将所有内容设置为UTF-8。特别是对于JSP文件,这是在Web > JSP Files > Encoding中完成的。选择最上面的UTF-8选项(称为“ISO 10646 / Unicode(UTF-8)”)。

对于属性文件,这是一个不同的故事。根据规范,默认情况下它们将作为ISO-8859-1读取。您需要使用native2ascii工具或提供使用UTF-8的自定义properfies文件加载器。有关更多详细信息,请参见此文章


1
我可以通过在XML中指定bean的编码来解决属性部分的问题。 - Czar
关于JSP文件,我将其缩小到以下内容:您的方法有效,但仅当在同一文件中指定编码时。使用INCLUDE标记时,不再起作用。看起来Eclipse正在寻找指定的JSP编码...有什么解决办法吗?我经常大量使用INCLUDES... - Czar
Eclipse似乎真的在JSP文件本身中寻找页面指令,并且不尊重包含。我该如何解决这个问题?我的包含文件是*.jsp,我尝试过*.inc和*.jspf,但没有改变。 - Czar
你在首选项中更改了JSP文件编码吗?我不确定这是否必要;但你可以尝试打开JSP文件,进行一些小的编辑(插入和删除空格),然后再次保存。 - BalusC

2
我正在使用Tomcat 7和Spring框架,当我在JSP中使用<jsp:include page="anyFile.html"/>来包含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"/>

正如您所看到的,JSLT库中的import标签具有一个charEncoding属性,可将HTML文件设置为适当的字符编码并正确显示其内容。

0

有关JSP,请参见@BalusC。

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

在将属性保存到流中或从流中加载属性时,使用ISO 8859-1字符编码。对于无法直接表示为此编码的字符,将使用Unicode转义序列;但是,在转义序列中只允许一个'u'字符。可以使用native2ascii工具将属性文件转换为其他字符编码。


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