我们在heroku上部署了基于maven-jetty的Java应用程序。
当地人,当我这样做时:
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
实际上,由于这个原因,我还面临着进一步的问题,因为我们必须解码具有UTF-8编码字符的Base-64编码文本。
我甚至没有尝试过以下方法:
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")
但是,我仍然无法看到像e-acute(é),umlaut(ö)等字符。
有没有办法在Heroku上解决这个问题?
pom.xml中的jdk版本是1.6
这是OpenJDK 1.7& Heroku下面的虚拟机?
提前致谢。
答案 0 :(得分:5)
最后,我与Heroku友好的工作人员取得了联系 - 他们通过file.encoding
env变量提出了以下建议来覆盖JAVA_OPTS
财产。
从我的Heroku Toolbelt发出以下内容,&事情现在开始起作用了。
heroku config:add JAVA_OPTS='-Xmx384m -Xss512k -XX:+UseCompressedOops -Dfile.encoding=UTF-8'
这样,JVM可以选择它,&现在Charset.defaultCharset( )
会返回UTF-8
,并会显示特殊字符!
他们还说,我们也可以做以下事情:
heroku config:add JAVA_TOOL_OPTIONS='-Dfile.encoding=UTF-8'
此外,最好将此属性嵌入到应用的Procfile中,这样当我们将其推送到新的Heroku应用时,我们的代码行为相同。
答案 1 :(得分:2)
设置file.encoding
系统变量。 Openjdk使用它来获取默认字符集。