场合
我正在使用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);
答案 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();
- 为我解决了。