2013-04-19 3 views
3

У нас есть приложение Java на основе maven-jetty, развернутое на heroku.По умолчанию Charset на Heroku (US-ASCII) вызывает проблемы

Локально, когда я делаю:

System.out.println("Default Charset = "+ Charset.defaultCharset()); 
String s = "Resumé of Schrödinger"; 
System.out.println("s = "+ s);` 

Я вижу (, как и ожидалось):

Default Charset = UTF-8 
s = Resumé of Schrödinger 

Но, когда я нажимаю приложение Heroku и проверить журналы, я вижу :

Default Charset = US-ASCII 
s = Resum?? of Schr??dinger 

На самом деле, я столкнулся с дополнительными проблемами из-за этого, поскольку мы ve, чтобы декодировать кодированный текст Base-64 с кодированными символами UTF-8.

Я даже попытался следующие без применения:

SAXBuilder builder = new SAXBuilder(); 
InputStream iStream = new ByteArrayInputStream(xmlAsString.getBytes("UTF-8")); 
Reader reader = new InputStreamReader(iStream, "UTF-8"); 
InputSource is = new InputSource(reader); 
is.setEncoding("UTF-8"); 

И позже, когда делать org.apache.commons.codec.binary.Base64.decodeBase64(byte []) я даже делать stringObject.getBytes("UTF-8")

Но все-таки, я не могу видеть символы, такие как е-острый (é), umlaut (ö) и т. д.

Есть ли способ решить эту проблему на Heroku?

версия JDK в pom.xml является 1,6

Является ли это причуда OpenJDK 1.7 & виртуальная машина под в Heroku?

Заранее спасибо.

+0

Звучит ужасно. Я знаю, что ruby ​​buildpack устанавливает 'LANG = en_US.UTF-8' и гарантирует, что приложения ruby ​​по умолчанию будут unicode. Не уверен в java buildpack, tho. Каково содержимое вашей 'heroku config'? Обязательно удалите любую конфиденциальную информацию, такую ​​как учетные данные подключения. – kch

+0

Похоже OpenJDK виновник –

+0

Моего Heroku значение конфигурации, как показано ниже: JAVA_OPTS: -Xmx384m -Xss512k -XX: + UseCompressedOops MAVEN_HOME:. MAVEN_OPTS: -Xmx384m -Xss512k -XX: + UseCompressedOops PATH: /app/.jdk/bin:/usr/local/bin:/usr/bin:/bin – fritz

ответ

5

Наконец, я связался с дружелюбным персоналом в Хереку - они предложили следующее: переодеться file.encoding недвижимость через переменную env-JAVA_OPTS.

Вышло следующее из моего инструмента Heroku Toolbelt, & Теперь все стало работать.

heroku config:add JAVA_OPTS='-Xmx384m -Xss512k -XX:+UseCompressedOops -Dfile.encoding=UTF-8' 

Таким образом, виртуальная машина поднимает его вверх, & Теперь Charset.defaultCharset() возвращается UTF-8, со специальными символами появляться, как они должны!

Они также сказали, мы могли бы в качестве альтернативы сделать следующее, а также:

heroku config:add JAVA_TOOL_OPTIONS='-Dfile.encoding=UTF-8' 

Кроме того, было бы хорошей идеей, чтобы встроить это право собственности в Procfile части приложения, так что наш код ведет себя когда мы подталкиваем его к новому приложению Heroku.

2

file.encoding системная переменная. Open jdk использует это, чтобы получить набор символов по умолчанию.

+0

Да, я даже попытался указать '-Dfile.encoding = UTF-8' в java, но безрезультатно. :-( – fritz

+0

И теперь даже попытался установить это свойство в файле 'system.properties' на корневом уровне моего приложения. Тем не менее значение' Charset.defaultCharset() 'является' US-ASCII' – fritz

+0

, лабораторная функция .... когда сборка пакетов устанавливает jvm, возможно, она не сможет получить доступ к этой переменной, если только функция лаборатории не получит доступ к системным переменным –

Смежные вопросы