Java Heroku将UTF-8字节替换为;(0xEF 0xBF 0xBD)
我在Heroku上托管的java文件中面临一个字符集问题(UTF-8) 用一个小例子更好地解释它:Java Heroku将UTF-8字节替换为;(0xEF 0xBF 0xBD),java,character-encoding,heroku,Java,Character Encoding,Heroku,我在Heroku上托管的java文件中面临一个字符集问题(UTF-8) 用一个小例子更好地解释它: // '…' UTF-8 encoding is 0xE2 0x80 0xA6 // stringToHex() outputs the HEX value to console/log stringToHex(new String("…".getBytes(), "UTF-8")); 现在,一切都可以在本地正常工作(Tomcat7)-“0xE2 0x80 0xA6”在控制台中输出 当我在Her
// '…' UTF-8 encoding is 0xE2 0x80 0xA6
// stringToHex() outputs the HEX value to console/log
stringToHex(new String("…".getBytes(), "UTF-8"));
现在,一切都可以在本地正常工作(Tomcat7)-“0xE2 0x80 0xA6”在控制台中输出
当我在Heroku(Jetty 7)上托管的登台服务器上尝试它时,“0xEF 0xBF 0xBD 0xEF 0xBF 0xBD 0xEF 0xBF 0xBD”被写入日志
这两台服务器都运行带有参数“-Dfile.encoding=UTF-8”的java(因此Charset.defaultCharset().toString()
在这两个服务器中都输出“UTF-8”)
有人能帮我解决这个奇怪的问题吗
谢谢
更新-忘了说:所有文件都用UTF-8编码,并使用javac-encoding UTF-8
更新2-尝试使用“£”而不是“…”,在临时服务器上,我得到“0xEF 0xBF 0xBD 0xEF 0xBF 0xBD”而不是“0xC2 0xA3”。。。似乎它总是将每个字节转换为“0xEF 0xBF 0xBD”(对应于�)... ???
更新3-由于Heroku正在使用Jetty,我尝试在本地使用Jetty,一切都很正常
更新4-以下是我的stringToHex()函数:
private void stringToHex(String string) throws UnsupportedEncodingException {
String result = "";
String tmp;
for(byte b : string.getBytes("UTF-8")) {
tmp = Integer.toHexString(0xFF & b);
if(tmp.length() == 1) {
tmp += '0';
}
result += "0x" + tmp.toUpperCase() + " ";
}
logger.info(result);
}
要在UTF-8中编译,我使用maven编译器plugin.pom.xml相关部分:
<plugins>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
...
</plugins>
...
org.apache.maven.plugins
maven编译器插件
2.3.2
UTF-8
...
问题是由于AspectJ配置造成的。如果要将AspectJ与Java和Spring一起使用,必须在插件配置中指定编码:
<plugins>
...
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.0</version>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.10</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>1.6.10</version>
</dependency>
</dependencies>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
<configuration>
<outxml>true</outxml>
<verbose>true</verbose>
<showWeaveInfo>true</showWeaveInfo>
<aspectLibraries>
<aspectLibrary>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</aspectLibrary>
</aspectLibraries>
<source>1.6</source>
<target>1.6</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
...
</plugins>
...
org.codehaus.mojo
aspectj maven插件
1
org.aspectj
aspectjrt
1.6.10
org.aspectj
aspectjtools
1.6.10
编译
测试编译
真的
真的
真的
org.springframework
春季方面
1.6
1.6
UTF-8
...
您是否在两台主机上使用相同的JVM?JVM从来没有要求支持-Dfile.encoding=UTF-8
系统属性,而且并非所有编码库都使用它-即使在Sun库中也是如此。请参阅。在转码操作中显式提供编码是编写可移植代码的唯一安全方法。感谢您的支持您的答案是@McDowell.Locally运行1.7.0_02,Heroku运行1.6.0_20。即使其中一个JVM不支持-Dfile.encoding=UTF-8
,在两台服务器上Charset.defaultCharset().toString()
返回“UTF-8”。如何显式提供编码?感谢使用or方法创建字节数组。我已经试过了,stringToHex(“£”)
,stringToHex(新字符串(“£”.getBytes(),“UTF-8”)
和stringToHex(新字符串(£.getBytes(“UTF-8”),“UTF-8”))
都给出了相同的错误输出。假设编译步骤正常(尝试转义字符串“\u2026”
),听起来stringToHex
方法中有缺陷。它转换为什么编码?如果它以本机Java UTF-16BE格式输出字符串值,它将是0x20 0x26。