Heroku заменяет байты UTF-8 на (0xEF 0xBF 0xBD) - PullRequest
0 голосов
/ 21 марта 2012

Я сталкиваюсь с проблемой кодировки (UTF-8) в java-файле, размещенном на Heroku.

Лучше объяснить это на небольшом примере:

// '…' 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 ".

На обоих серверах запущен Java с параметром" -Dfile.encoding = UTF-8 "(поэтому 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 голосов
/ 25 марта 2012

Проблема была связана с конфигурацией 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...