3

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

提前致谢。

4

2 回答 2

5

最后,我与 Heroku 友好的工作人员取得了联系——他们提出了以下建议,通过env 变量覆盖file.encoding属性。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 应用程序时,它的行为相同。

于 2013-04-24T05:35:57.877 回答
2

设置file.encoding系统变量。Open jdk 使用它来获取默认字符集。

于 2013-04-19T19:05:43.670 回答