gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:54:55 31 4
gpt4 key购买 nike

情况

我正在使用 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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com