我正在使用简单的代码来检索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()));

07-24 21:17