【问题标题】:GAE Datastore: can't get UTF-8 to work as default encodingGAE 数据存储:无法将 UTF-8 用作默认编码
【发布时间】:2014-01-14 12:32:01
【问题描述】:

总结

我遇到了无法解决的字符串编码和 GAE 问题。基本上我有一个经典的编码问题,像 ñ、é、ü 等特殊字符在数据存储查看器和客户端中都显示为 ��,但是,仅在生产模式下。

我通过两种机制将数据保存到数据存储区: - 用户输入:这在开发模式和生产中都非常有效 - 第 3 方 API:这个适用于开发模式,但不适用于生产

跟踪数据

  • 当我向第 3 方 API 请求数据时,响应标头告诉我数据采用 UTF-8 格式。如果我看到响应内容,我可以很好地读取数据

    内容类型:文本/html;字符集=utf-8

  • 此请求使用 gson 处理并转换为 java 类。据我所知,没有办法为gson指定char编码
  • 然后我将数据带到数据存储区而不更改其编码(至少在我的应用程序点)
  • 问题的第一个迹象:如果我查看生产数据存储区,编码已经丢失
  • 在客户端 (GWT) 上,我收到同样以 UTF-8 编码的数据,但字符串已经有 �� 符号。
开发模式 VS 生产

我已将 Eclipse 配置为 UTF-8。我认为这就是开发模式下一切运行良好的主要原因。

我还没有找到如何将生产 JVM 设置为 UTF-8(我读到 here,默认是 US-ASCII,可能无法更改) - 在开发模式下,我将 Eclipse 配置为使用 UTF-8 - 在生产模式下,我遵循了this guy 的建议,但它并没有改变行为:

Top-level appengine-web.xml:

<system-properties>
    <!-- Configure java.util.logging -->
    <property name="java.util.logging.config.file" value="WEB-INF/logging.properties" />
    <!-- UTF-8 Support -->
    <property name="file.encoding" value="UTF-8" />

</system-properties>

<!-- UTF-8 Support -->
<env-variables>
    <env-var name="DEFAULT_ENCODING" value="UTF-8" />
</env-variables>

我不知道还能做些什么来修复它。有没有人有解决这个问题的方法?

【问题讨论】:

  • 令人困惑的是,它在开发模式而非生产模式下运行良好。 App Engine 上的数据存储区查看器显示特殊字符的事实 ????而不是正确编码的字符指向这样一个事实,即在某个地方,字符编码丢失了。如果 Web 服务(即您从中检索它的外部 API)已对其进行了正确编码,并且您只需将其设置在数据存储区中,那么一切都应该有效。
  • @Romin 我认为我的 Eclipse 设置为使用 UTF-8。这就是为什么它在开发模式下可以正常工作的原因。但不知何故,GAE 的生产 Java VM 必须使用不同的编码。我需要找出如何改变它...

标签: google-app-engine utf-8 character-encoding google-cloud-datastore gson


【解决方案1】:

不幸的是,由于这里没有答案,我认为没有办法将 UTF-8 设置为 GAE 生产 JVM 上的默认编码。

在上面困扰我的情况下,我的问题是我正在使用默认编码读取第 3 方 API 请求,在生产 GAE 中是 US-ASCII:

BufferedReader reader = 
    new BufferedReader(new InputStreamReader(url.openStream());

将上面的行改为

BufferedReader reader = 
    new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8");

解决问题。

【讨论】:

    猜你喜欢
    • 2016-08-06
    • 2012-03-10
    • 2012-02-01
    • 2014-04-23
    • 1970-01-01
    • 2013-04-28
    • 2021-03-22
    • 1970-01-01
    • 2015-04-14
    相关资源
    最近更新 更多