Heroku用 替换UTF-8字节(0xEF 0xBF 0xBD)

时间:2012-03-21 15:54:54

标签: java character-encoding heroku

我在Heroku上托管的java文件中遇到了charset问题(UTF-8)。

使用一个小例子更好地解释它:

// '…' UTF-8 encoding is 0xE2 0x80 0xA6
// stringToHex() outputs the HEX value to console/log
stringToHex(new String("…".getBytes(), "UTF-8"));

现在,一切都在本地完美运行(Tomcat 7) - 在控制台中输出“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-compiler-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>

1 个答案:

答案 0 :(得分:0)

问题是由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>