Java Eclipse/Spring/Tomcat 6中的奇怪字符编码问题
我一整天都在尝试,但找不到合适的解决办法。我的问题是:我正在本地的Tomcat中开发一个基于Spring MVC的应用程序。我的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
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”
- server.xml中连接器上的URIEncoding=“UTF-8”(正常,因为它涉及URI编码而不是页面编码)
打开和关闭org.springframework.web.filter.CharacterEncodingFilter
- 还有(我可能没有抓住要点):
fr UTF-8
-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标记库和导入标记找到了解决方案:
您可以看到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>