我在webapp中编码/解码法语字符时遇到问题。 技术堆栈看起来像:
我有一个实用程序类来编码/解码如下:
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>
另外,我有一个包含帮助jar的webapp(war)。 在war里面的Servlet中,它接收一个包含String
的主体的POSTè è è test 2
然后在读完POST主体之后,我将它传递给了解码函数,结果得到了这个结果:
[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这很好,但是同样的问题如上所述,当我尝试解码我最终用¨而不是è
感谢您的帮助