我们使用的是 Tomcat 7 的生产服务器,无论出于何种原因,管理员都避免设置 CATALINA_OPTS="-Dfile.encoding=UTF-8"
我们的解决方法。
这意味着现在部署 WAR 文件时,Tomcat 返回乱码而不是对应的 Unicode 字符。
我们还将其包含在我们的 web.xml
中,无济于事:
<filter>
<filter-name>encoder</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoder</filter-name>
<url-pattern>*</url-pattern>
</filter-mapping>
我们如何在不派人闯入服务器机房并修改配置的情况下管理此问题?
最佳答案
首先,了解 -Dfile.encoding=UTF-8
的确切用途非常重要。它是 Sun/Oracle JVM 特定的设置(因此不一定适用于所有其他 JVM!),它基本上指示 JVM 使用给定的编码而不是使用给定的编码来读取 Java .class
文件。平台默认一。因此,设置它只能解决任何可能的 Mojibake这是由于在 Java 类/变量名称中使用“特殊字符”或在 Java 类中使用硬编码 String
值引起的问题(是的,你没看错:只有 Java 类,而不是其他文件,因此绝对不是属性)文件或 JSF XHTML 文件等)。
老实说,我很难想象这是解决您的具体问题的正确解决方案。为什么要在 Java 类中直接使用特殊字符?类/变量名称应为全英文,并且本地化文本应放置在资源包文件中。每个自尊的 Java 开发人员都遵守这一约定。
鉴于这一事实,并假设您根本没有在 Java 类中使用特殊字符,因此我相信您的具体问题是由其他原因引起的。问题症状描述得不够具体(具体在哪一步失败?您到底期望并得到哪些字符?等等),无法了解具体问题的可能根本原因。我至少可以看出你的 Spring 过滤器的 URL 模式是完全错误的。它必须映射到/*
<filter-mapping>
<filter-name>encoder</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
(顺便说一句,您不一定需要 Spring,只需 a custom Filter
,在 doFilter()
实现中只有 2 或 3 行已经足够了)
另请参阅:
关于java - 使 Web 应用程序使用 UTF-8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12675070/