Google AppEngine - 如何为Google AppEngine设置默认字符集/文件编码(为UTF-8)

时间:2016-12-18 02:28:34

标签: java android google-app-engine encoding character-encoding

场合

我正在使用AppEngine Cloud Endpoints (Java)作为我的Android应用程序的后端服务器。在Cron-Job中,服务器定期下载新数据(String),过滤掉相关信息并通过Firebase Cloud Messaging将其发送到不同的主题(通过将HTTP-Request发布到https://fcm.googleapis.com/fcm/send)。

(该死的简单)问题

下载的文字是德文的,包含ä,ö,ü,ß等字母(以及没有着名的字母,而不是这些字符) 我想将编码更改为UTF-8 即可。

US-ASCII编码是部署到AppEngine时的默认值(为什么默认情况下不是UTF-8)。在本地测试时,使用我的计算机的默认编码,即UTF-8和 一切正常

所以我只想Charset.getDefaultCharset()返回UTF-8 我该如何实现这一目标? 在此先感谢,所有帮助表示赞赏。

我尝试了什么

  • 将此添加到appengine-web.xml:

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

    在本地测试时,我得到了IncorrectEnvironmentVariableException。当部署的编码仍为ASCII时。

  • 将其添加到appengine-web.xml中的<system-properties> - 标记:

    <property name="file.encoding" value="UTF-8" /> <property name="DEFAULT_ENCODING" value="UTF-8" />

    什么都没有改变,不仅在部署时,而且在我尝试使用它在本地开发服务器上将编码设置为US-ASCII时,Charset.getDefaultCharset()仍然返回了UTF-8

  • 甚至尝试使用反射:

    System.setProperty("file.encoding","UTF-8"); Field charset = Charset.class.getDeclaredField("defaultCharset"); charset.setAccessible(true); charset.set(null,null);

    (导致IllegalAccessException)

  • 尝试使用HTTP-post将编码设置为content-type-property(不起作用):

    connection.setRequestProperty("Content-Type", application/json; charset=UTF-8);

1 个答案:

答案 0 :(得分:0)

简答

如果您遇到编码问题(即'?')并且似乎就像更改default-charset解决问题那么真正必须做的就是找到default-charset用于编码的代码,并传递一个自定义字符集来代替

(比如@AndreiVolgin评论说:你永远不要依赖系统默认字符集。)

更详细的答案

字符集指定字符如何表示为数字(即字节)。 Java中所有字符串的内部字符集实际上是UTF-16所以自定义字符集变得重要的唯一时间是将字符串转换为字节数组(String.getBytes())或反之亦然({{1} })即可。
如果您没有传递new String(byte[]String.getBytes(Charset)之类的字符集,则使用default-charset。

当不同的字符集用于编码(new String(byte[], Charset))和解码(String.getBytes())时,你会看到'?'。

那么要摆脱'?'new String(byte[]替换为String.getBytes() (或者可以将String.getBytes(Charset)替换为new String(byte[])但不要'我知道这是不是一件事。)

对我来说,在通过互联网发送一些文本时出现编码问题,因为需要将字符串转换为new String(byte[], Charset)以使用byte[]发送它。

准确地说:在课程HttpURLConnection.getOutputStream().write(byte[])中,方法com.google.android.gcm.server.Sender,第471行是post(java.lang.String, java.lang.String, java.lang.String)

我把它改为(覆盖它)到byte[] bytes = body.getBytes(); - 为我解决了。