Heroku上的默认字符集(US-ASCII)导致问题

时间:2013-04-19 13:43:19

标签: java heroku utf-8 character-encoding base64

我们在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下面的虚拟机?

提前致谢。

2 个答案:

答案 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使用它来获取默认字符集。