GAE数据存储:无法使UTF-8作为默认编码工作

时间:2014-01-14 12:32:02

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

摘要

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

我通过两种机制将数据保存到数据存储区: - 用户输入:这在开发模式和生产中都很完美 - 第三方API:此版本适用于开发模式,但不适用于生产

关注数据

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

      

    的Content-Type:text / html的;字符集= UTF-8

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

我不知道还有什么可以解决它。有没有人解决这个问题呢?

1 个答案:

答案 0 :(得分:3)

嗯,遗憾的是,基于这里缺乏答案,我认为没有办法将UTF-8设置为GAE生产JVM的默认编码。

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

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

将上面的行更改为

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

解决了这个问题。