- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
情况
我正在使用 AppEngine Cloud Endpoints (Java)作为我的 Android 应用程序的后端服务器。在 Cron-Job 中,服务器定期下载新数据(字符串),过滤掉相关信息并通过 Firebase 云消息传递将其发送到不同的主题(通过将 HTTP 请求发布到 https://fcm.googleapis.com/fcm/send)。
(该死的简单)问题
下载的文本是德语,包含 ä、ö、ü、ß 和(不用著名的 ?s 代替这些字符)我想将编码更改为 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 时。
将此添加到 <system-properties>
-appengine-web.xml 中的标记:
<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);
(导致非法访问异常)
尝试使用 HTTP-post 将编码设置为内容类型属性(无效):
connection.setRequestProperty("Content-Type", application/json; charset=UTF-8);
最佳答案
如果您遇到编码问题(即 '?'s)并且似乎更改默认字符集可以解决问题,那么您真正必须做的是找到使用默认字符集进行编码的代码,并传递要使用的自定义字符集。
(就像@AndreiVolgin 评论的那样:您永远不应该依赖系统默认字符集。)
字符集指定字符如何表示为数字(即字节)。Java 中所有字符串的内部字符集实际上都是 UTF-16,所以自定义字符集唯一重要的时候是将字符串转换为字节数组 (String.getBytes()
),反之亦然 (new String(byte[]
)
.
如果你不传递像String.getBytes(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
, 方法 post(java.lang.String, java.lang.String, java.lang.String)
,第 471 行是 byte[] bytes = body.getBytes();
.
我将其更改(覆盖)为 byte[] bytes = body.getBytes("UTF-8");
- 帮我解决了。
关于java - Google AppEngine - 如何为 Google AppEngine 设置默认字符集/文件编码(到 UTF-8),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41204936/
我是一名优秀的程序员,十分优秀!