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

Java Google AppEngine-如何为Google AppEngine设置默认字符集/文件编码(UTF-8),java,android,google-app-engine,encoding,character-encoding,Java,Android,Google App Engine,Encoding,Character Encoding,形势 我正在使用Android应用程序作为后端服务器。在Cron作业中,服务器定期下载新数据(字符串),过滤出相关信息,并通过Firebase云消息将其发送到不同的主题(通过向发布HTTP请求) 这个(该死的简单)问题 下载的文本是德语,包含像ä、ö、ü、ß和(为了不使用这些字符的著名istead)我想将编码更改为UTF-8 部署到AppEngine时,US-ASCII编码是默认编码(为什么默认情况下不是UTF-8…)。在本地测试时,我的计算机使用的默认编码是UTF-8,一切正常 所以我只想Ch

形势

我正在使用Android应用程序作为后端服务器。在Cron作业中,服务器定期下载新数据(字符串),过滤出相关信息,并通过Firebase云消息将其发送到不同的主题(通过向发布HTTP请求)

这个(该死的简单)问题

下载的文本是德语,包含像ä、ö、ü、ß和(为了不使用这些字符的著名istead)我想将编码更改为UTF-8

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

所以我只想
Charset.getDefaultCharset()
返回
UTF-8

我如何做到这一点? 提前感谢,感谢您的帮助

我尝试过的

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

    
    

    在本地测试时,我得到了不正确的EnvironmentVariableException。部署时,编码仍然是ASCII

  • 将此添加到appengine-web.xml中的
    -标记:

    
    

    不做任何更改,不仅是在部署时,而且在我试图使用它在本地开发服务器上将编码设置为US-ASCII时,
    Charset.getDefaultCharset()

  • 甚至尝试使用反射:

    System.setProperty(“file.encoding”、“UTF-8”);
    Field charset=charset.class.getDeclaredField(“defaultCharset”);
    setAccessible字符集(true);
    set(null,null)

    (导致非法访问异常)

  • 尝试使用HTTP post将编码设置为内容类型属性(无效):

    connection.setRequestProperty(“内容类型”,application/json;charset=UTF-8)

简短回答 如果您在编码方面有问题(即“?”),并且更改默认字符集似乎可以解决问题,那么您真正需要做的是找到默认字符集用于编码的代码,并传递一个自定义字符集来代替

(就像@AndreiVolgin评论的那样:您永远不应该依赖系统默认字符集。)

更详细的回答 字符集指定如何将字符表示为数字(即字节)。 Java中所有字符串的内部字符集实际上都是UTF-16,因此自定义字符集变得重要的唯一时间是将字符串转换为字节数组(
String.getBytes()
)或反之亦然(
新字符串(byte[]
)。
如果不传递像
String.getBytes(charset)
新字符串(byte[],charset)
这样的字符集,则使用默认字符集

当不同的字符集用于编码(
String.getBytes()
)和解码(
新字符串(byte[]
)时,您会看到“?”

所以,为了去掉“?”
String.getBytes()
替换
String.getBytes(Charset)
(或者用
新字符串(byte[])
替换
新字符串(byte[],Charset)
,但不知道这是不是一件事)


对我来说,通过internet发送某些文本时出现编码问题,因为字符串需要转换为
byte[]
才能使用
HttpURLConnection.getOutputStream().write(byte[])
发送

准确地说:在class
com.google.android.gcm.server.Sender
中,方法
post(java.lang.String,java.lang.String,java.lang.String)
,第471行是
字节[]字节=body.getBytes();


我把它改成了(
byte[]bytes=body.getBytes(“UTF-8”);
-为我解决了这个问题。

我从来没有设置过任何系统变量,在过去的7年里,我在App Engine上使用任何语言(德语、俄语等)都没有问题:)@AndreiVolgin好吧,那么你很幸运,我没有更改任何内容,默认字符集是ASCII。显然你不是这样(我羡慕你…)但是关于改变编码有几个问题,不仅我有这个问题。我尝试了所有这些问题的答案,即使是那些评分最低的问题,但都不起作用。AppEngine有什么问题,这似乎不可能做到,因为它应该像设置一个偏好一样简单……这与运气无关,也与其他因素无关应用程序引擎。你不应该依赖于系统字符集-不依赖于应用程序引擎,也不依赖于其他任何地方。请查找有关如何为HTTP请求设置UTF-8编码的答案。@AndreiVolgin首先:查看我尝试的最后一点。第二:问题发生在发布HTTP请求之前。我使用
Reader r=new InputStreamReader(connection.getInputStream(),Charset.forName(“UTF-8”);
用于下载。现在何时用于“Ä”
r.read()
返回196,它不在ASCII表中,对
字符的强制转换将创建一个“?”。此时,如果AppEngine的默认字符集是UTF-8,一切都会很好。如果我不应该依赖于系统字符集,我如何避免这种情况?我无法在不创建“?”的情况下为字符串分配“Ä”。您在哪里看到这个“?”?如果您在日志中的某个地方看到它,问题可能是日志中的编码,而不是正确读取字符串的代码。