【发布时间】:2017-05-03 11:06:21
【问题描述】:
情况
我正在使用AppEngine Cloud Endpoints (Java) 作为我的 Android 应用程序的后端服务器。在 Cron-Job 中,服务器会定期下载新数据(字符串),过滤掉相关信息并通过 Firebase 云消息传递到不同的主题(通过将 HTTP-Request 发布到 https://fcm.googleapis.com/fcm/send)。
(该死的简单)问题
下载的文本是德语,包含 ä,ö,ü,ß 等字母和(没有著名的 ?s 代替这些字符)我想将编码更改为 UTF-8 。
部署到 AppEngine 时默认使用 US-ASCII 编码(为什么默认不是 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>-tag:<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 将编码设置为内容类型属性(无效):
connection.setRequestProperty("Content-Type", application/json; charset=UTF-8);
【问题讨论】:
-
在过去的 7 年里,我从未设置任何系统变量,并且在 App Engine 上使用任何语言(德语、俄语等)都没有问题 :)
-
@AndreiVolgin 好吧,那你很幸运,我没有更改任何内容,默认字符集是 ASCII。这显然不是你的情况(我羡慕你......)但是关于改变编码的问题有几个问题,不仅我有这个问题。我尝试了这些问题的所有答案,即使是那些评分最低的,但没有任何效果。 AppEngine 有什么问题,这似乎不可能像设置一个偏好一样简单......
-
这与运气或 App Engine 无关。您不应该依赖系统字符集——不应该依赖 App Engine,也不应该依赖其他任何地方。寻找有关如何为 HTTP 请求设置 UTF-8 编码的答案。
-
@AndreiVolgin 首先:看看我尝试过的最后一点。第二:问题发生在发布 HTTP 请求之前。我使用
Reader r = new InputStreamReader(connection.getInputStream(), Charset.forName("UTF-8");进行下载。现在,当 for "Ä"r.read()返回 196(不在 ASCII 表中)时,转换为char会创建一个 '?'。在这一点上,如果 AppEngine 的默认字符集是 UTF-8,一切都会好起来的。如果我不应该依赖系统字符集,我该如何规避呢?如果不创建“?”,我无法将“Ä”分配给字符串。 -
你在哪里看到这个“?” ?如果您在某处的日志中看到它,则问题可能在于日志中的编码,而不是您正确读取字符串的代码。
标签: java android google-app-engine encoding character-encoding