我在我的 web 应用程序中编码/解码法语字符时遇到问题。技术堆栈如下所示:
- 一个实用 jar,它对使用目标 Java 1.5 编译的法语字符进行了编码/解码
- 一场将使用 maven 编译的战争,目标是 Java 1.5
- Tomcat 5.5.17 / JVM 1.5.0_06-b05
我有一个实用程序类来编码/解码如下:
public static String encodeFrenchCharacters(String src)
{
String output = src;
logger.info("[encodeFrenchCharacters] start: " + output);
output = output.replaceAll("è","è");
logger.info("[encodeFrenchCharacters] end: " + output);
return output;
}
public static String decodeFrenchCharacters(String src)
{
String output = src;
logger.info("[decodeFrenchCharacters] start: " + output);
output = output.replaceAll("è","è");
logger.info("[decodeFrenchCharacters] end: " + output);
return output;
}
我编写了一个简单的 Java 程序来测试功能:
public static void main(String[] args)
{
String s1 = "è è è test 2";
System.out.println("s1: " + s1);
String s2 = encodeFrenchCharacters(s1);
System.out.println("s2: " + s2);
String s3 = decodeFrenchCharacters(s1);
System.out.println("s3: " + s3);
}
正如预期的那样,一切正常:
s1: è è è test 2
[encodeFrenchCharacters] start: è è è test 2
[encodeFrenchCharacters] end: è è è test 2
s2: è è è test 2
[decodeFrenchCharacters] start: è è è test 2
[decodeFrenchCharacters] end: è è è test 2
s3: è è è test 2
所以上面看起来不错。该实用程序类位于通过 maven 编译的 jar 中:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.5</source>
<target>1.5</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
另外,我有一个包含 helper jar 的 webapp (war)。在war里面的Servlet中,它接收到一个POST,body中包含了String
è è è test 2
然后在阅读 POST 正文后,我将其传递给 decode 函数,结果如下:
[decodeFrenchCharacters] start: è è è test 2
[decodeFrenchCharacters] end: è è è test 2
在 Tomcat server.xml 我已经有:
<Connector port="8383" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true"
URIEncoding="UTF-8"
/>
在我的 Servlet doPost 我也尝试添加
request.setCharacterEncoding("UTF-8");
这里发生了什么?为什么当我在简单的 Java 程序中运行它(在我的机器上本地运行)时它可以工作,然后当我将它作为对 tomcat 的战争部署时,它无法处理法语字符?
旁注:我的第一次尝试实际上没有使用手动替换法语字符的实用程序类,我使用的是 Java 的 URLEncode 和 URLDecode,它给了我 %C3%A8 这很好,但与上面相同的问题,当我尝试解码时我结束了用 è 而不是 è
谢谢你的帮助