【问题标题】:Java: String UTF-8 encoding difference between local app and Google App EngineJava:本地应用程序和 Google App Engine 之间的字符串 UTF-8 编码差异
【发布时间】:2011-06-16 12:55:35
【问题描述】:

我正在尝试让 Google App Engine 网络应用程序将 UTF-8 编码文本发送回浏览器。 我这样做,写这个:

byte[] utf8Bytes = "æøå".getBytes("UTF-8");

当我在本地执行此操作时,我得到一个包含 6 个字节的字节数组。 当我在 Google App Engine 上执行此操作时,我得到一个 12 字节的数组。很奇怪吧?

有人知道为什么吗?

我通过自己对字节进行编码,成功地从 GAE 编写了 UTF-8 编码文本, 并写回原始字节。像这样:

output.write(new byte[]{(byte)0xc3, (byte)0xa5, (byte) 0xc3, (byte)0xa6, (byte)0xc3, (byte)0xb8 });

这确实有效。但是,有没有人回答为什么 GAE 上的字符串编码与本地编码不同?

注意:通过 unicode 转义对字符进行编码 - 像这样:

byte[] utf8Bytes = "\u00E5\u00F8\u00E6".getBytes("UTF-8");

【问题讨论】:

  • 您从 GAE 获得的 12 个字节是多少?
  • GAE中得到的12个字节为(十六进制值) c3 83 c2 a6 c3 83 c2 b8 c3 83 c2 a5 本地,这6个字节为:c3 a6 c3 b8 c3 a5
  • @Jakob - 你编译源代码的方式有什么不同吗?见here.
  • @McDowell:是的,确实有。我会调查一下,然后回来。
  • 我最终在代码中编写了 \u 编码,然后它就可以工作了。这一定是编译器问题 - 认为 Java 文件还不是 UTF-8,因此对字符串进行了双重编码。这有效 byte[] utf8Bytes = "\u00E5\u00F8\u00E6".getBytes("UTF-8");

标签: java google-app-engine utf-8


【解决方案1】:

您从 GAE 获得的字节让我假设带有“æøå”字面量的源代码文件保存为 UTF-8,但使用编译器编译,该编译器期望源文件被编码为 ISO-8859- 1、ISO-8859-15或Cp1252。

如果您使用 Ant 或 Maven 构建源代码,则必须在 build.xml 或 pom.xml 中指定源文件编码。

【讨论】:

  • 我认为你是对的。我正在使用 Google App Engines 脚本/工具构建代码。我一直在寻找开关等来更改编译器的编码,并且确实找到了一个,但它没有改变任何东西。但是,对代码中的特殊字符使用\uxxxx代码,解决了这个问题。
【解决方案2】:

您确定在获取 Writer 之前已在 HttpServletResponse 中设置了内容编码吗?

【讨论】:

  • 我将字节直接写入OutputStream,所以服务器不应该干扰我写的内容。此外,在我写回结果之前,问题就已经出现了。我从字符串中得到 12 个字节而不是 6 个字节。问题已经在这里了。
  • 啊,谢谢你的澄清。那么在 eclipse、ant、maven 或 javac 中,您的源编码确实是问题所在。
猜你喜欢
  • 2016-03-10
  • 2011-03-09
  • 1970-01-01
  • 2011-10-29
  • 2011-09-02
  • 1970-01-01
  • 1970-01-01
  • 2011-09-06
  • 2015-07-18
相关资源
最近更新 更多