Я сталкиваюсь с проблемой кодировки (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>