Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Heroku将UTF-8字节替换为࿽;(0xEF 0xBF 0xBD)_Java_Character Encoding_Heroku - Fatal编程技术网

Java Heroku将UTF-8字节替换为࿽;(0xEF 0xBF 0xBD)

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

我在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”在控制台中输出

当我在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。