Java Google AppEngine-如何为Google AppEngine设置默认字符集/文件编码(UTF-8)
形势 我正在使用Android应用程序作为后端服务器。在Cron作业中,服务器定期下载新数据(字符串),过滤出相关信息,并通过Firebase云消息将其发送到不同的主题(通过向发布HTTP请求) 这个(该死的简单)问题 下载的文本是德语,包含像ä、ö、ü、ß和(为了不使用这些字符的著名istead)我想将编码更改为UTF-8 部署到AppEngine时,US-ASCII编码是默认编码(为什么默认情况下不是UTF-8…)。在本地测试时,我的计算机使用的默认编码是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
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)代码>
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[])
发送
准确地说:在classcom.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,一切都会很好。如果我不应该依赖于系统字符集,我如何避免这种情况?我无法在不创建“?”的情况下为字符串分配“Ä”。您在哪里看到这个“?”?如果您在日志中的某个地方看到它,问题可能是日志中的编码,而不是正确读取字符串的代码。