我正在使用简单的代码来检索JSON对象。 JSON采用Unicode,并包含一些西里尔字符。
URL url = new URL("blahblah");
URLConnection con = url.openConnection();
con.setConnectTimeout(10000);
BufferedReader reader = new BufferedReader(new inputStreamReader(con
.getInputStream()));
String json = reader.readLine();
该代码在“标准” Java实现中运行良好:
Владивосток
但是,当我在Google App Engine应用程序中使用相同的代码段时,某些西里尔字母被替换为``?字符:
``?ладиво''?
我注意到,从basic Cyrillic character set只能正确读取中间部分(代码为0421-043F的符号)。我不知道该怎么做。
这是由Google重新实现
java.net
类引起的,还是我的疏忽之处? 最佳答案
您必须使用与在其他服务器/源上创建和发送数据相同的编码。
在InputStreamReader
的构造函数中指定相同的编码。
例如,如果要使用UTF-8编码:
BufferedReader reader = new BufferedReader(new InputStreamReader(
con.getInputStream(), StandardCharsets.UTF_8));
如果您未明确指定编码,请引用javadoc of the constructor that doesn't take the encoding:
创建使用默认字符集的
InputStreamReader
。因此,将使用依赖于平台的默认字符集,因此它在不同的操作系统上可能会有所不同。因此,请始终指定字符集。
编辑:
建议使用服务器报告的编码。您可以通过
URLConnection.getContentEncoding()
获得此信息:BufferedReader reader = new BufferedReader(new InputStreamReader(
con.getInputStream(), con.getContentEncoding()));