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

Java Eclipse/Spring/Tomcat 6中的奇怪字符编码问题,java,eclipse,spring,jsp,character-encoding,Java,Eclipse,Spring,Jsp,Character Encoding,我一整天都在尝试,但找不到合适的解决办法。我的问题是:我正在本地的Tomcat中开发一个基于Spring MVC的应用程序。我的MySQl数据库有UTF-8编码集,当使用phpMyAdmin时,其中的所有内容都能正确显示。此外,在catalina.out中使用log4j在日志文件中的输出也可以正常工作 我的JSP页面由 <!-- encoding --> <%@ page contentType="text/html; charset=UTF-8" %> <%@ p

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

我的JSP页面由

<!-- encoding -->
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ page pageEncoding="UTF-8" %>
在日志和浏览器的jsp页面上正确显示

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

显示mymessages.properties文件中的文本标记时也会出现同样的问题,尽管Eclipse在右键单击时表示将使用UTF-8

我有点迷路了,现在不知道去哪里查

总结:

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

有什么想法吗?我真的很感谢您的帮助和提示。

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

进入窗口>首选项,在顶部输入过滤文本
编码
,浏览所有部分以将所有内容设置为UTF-8。特别是对于JSP文件,这是在Web>JSP文件>编码中实现的。选择最顶层的UTF-8选项(称为“ISO10646/Unicode(UTF-8)”)

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

有关JSP,请参见@BalusC

有关属性文件,请参见:

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

探索 我的问题与您的问题完全相同,配置非常相似(Tomcat、Spring、SpringWebFlow、JSF2)

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

  • Tomcat窗口下的战争:编码问题
  • Tomcat Linux下的同一场战争:没问题→ 可疑操作系统默认编码,因为Linux在UTF-8中
  • Windows上Eclipse WTP运行的Tomcat下的相同战争:没问题→ WTF
  • 使用自然拉丁字符而不是unicode占位符传递UTF-8中的属性文件:解决外部化标签的问题
  • Facelets(JSF2页面)也一样:总是会遇到问题,唯一有效的方法是
    &;伊库特
在检查了我的所有代码以了解论坛上的经典先决条件和推荐之后,仍然存在问题:

  • 在XML文件的顶部
  • 在相同文件的HTML头中
  • 中的
    encoding=“UTF-8”
以以下方式配置Tomcat没有任何作用:

  • server.xml中连接器上的URIEncoding=“UTF-8”(正常,因为它涉及URI编码而不是页面编码)
  • org.springframework.web.filter.CharacterEncodingFilter
    打开和关闭
  • 还有(我可能没有抓住要点):

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

设置JAVA\u OPTS=-Dfile.encoding=“UTF-8”,它工作正常。

(试图)解释 我找到的唯一解释是,Tomcat使用JVM编码,默认情况下是系统编码(Linux上是UTF-8,Windows上是CP1252)。EclipseWTP根据其工作区编码设置强制JVM编码。在UTF-8中传递JVM给出了解决方案


我怀疑它不是真正正确的,我的堆栈或maven resources plugin或maven war plugin所做的资源过滤上存在配置问题,但我还没有找到它。

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

要解决包含文件的其他问题,只需包含标题


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

我将Tomcat 7与Spring框架一起使用,并在JSP中使用
失败,并给我一个
java.lang.IllegalStateException
。如果我想包含另一个JSP文件而不是静态HTML文件,
可以很好地工作,但是当我尝试注入静态HTML文件时,它总是给我这个与字符编码相关的异常

使用
可以工作,但所有特殊字符(“é”、“è”、“ç”等)都显示为编码为ISO-8891而不是UTF-8,即使JSP文件中包含

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

  • 将其放入JSP中:

  • 然后使用以下命令获取要包含的HTML文件:


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

    同时,我可以通过在X中的bean中指定编码来解决属性部分
    String str = "UTF-8 Test: Ä Ö Ü ß è é â";
    logger.debug(str);
    mav.addObject("utftest", str);
    
    <locale-encoding-mapping-list>
      <locale-encoding-mapping>
        <locale>fr</locale>
        <encoding>UTF-8</encoding>
      </locale-encoding-mapping>
    </locale-encoding-mapping-list>