Google app engine GAE数据存储:can';t让UTF-8作为默认编码工作

Google app engine GAE数据存储:can';t让UTF-8作为默认编码工作,google-app-engine,utf-8,character-encoding,google-cloud-datastore,gson,Google App Engine,Utf 8,Character Encoding,Google Cloud Datastore,Gson,摘要 我有一个无法解决的字符串编码和GAE问题。基本上,我有一个经典的编码问题,像ñ,é,ü这样的特殊字符��� 在数据存储查看器和客户端中,但仅在生产模式下 我通过两种机制将数据保存到数据存储: -用户输入:这在开发模式和生产模式下都非常有效 -第三方API:此API在开发模式下工作,但不在生产模式下工作 在数据之后 当我向第三方API请求数据时,响应头告诉我数据是UTF-8格式的。如果我看到响应内容,我可以很好地读取数据 内容类型:text/html;字符集=utf-8 该请求使用gson

摘要

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

我通过两种机制将数据保存到数据存储: -用户输入:这在开发模式和生产模式下都非常有效 -第三方API:此API在开发模式下工作,但不在生产模式下工作

在数据之后

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

    内容类型:text/html;字符集=utf-8
  • 该请求使用gson处理并转换为java类。就我所见,没有办法为gson指定字符编码
  • 然后我将数据带到数据存储,而不更改其编码(至少在我的应用程序点中)
  • 问题的第一个迹象:如果我查看生产数据存储,编码已经丢失
  • 在客户机(GWT)上,我接收同样以UTF-8编码的数据,但字符串已经存在�� 辛波尔斯
开发模式与生产模式的对比

我已经为UTF-8配置了Eclipse。我认为这就是为什么在开发模式下一切都运行得很好的主要原因

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

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>
顶级appengine-web.xml:

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

很遗憾,由于这里没有答案,我认为没有办法将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");

解决了这个问题。

注意到它在开发模式下工作良好,而不是在生产模式下工作,这让人感到困惑。事实上,App Engine上的数据存储查看器显示的是特殊字符????没有正确编码的字符表明了这样一个事实:在这一过程中,字符编码丢失了。如果Web服务(即您从中检索它的外部API)已正确编码,并且您只需在数据存储中设置它,那么一切都应该正常工作。@Romin我想发生的事情是,我将Eclipse设置为使用UTF-8。这就是为什么它可以在开发模式下正常工作。但不知何故,GAE的JavaVM产品必须使用不同的编码。我需要找出如何改变这一点。。。