使用Java下载UTF-16 JSON字符串

使用Java下载UTF-16 JSON字符串,java,android,json,gson,utf-16,Java,Android,Json,Gson,Utf 16,我正在将我们的iOS应用程序转换为Android(第一次使用Android,但使用了很长时间的Java程序员)。有一个web服务为应用程序提供2个JSON提要。这个web服务是用Python编写的,第一个JSON字符串作为“ascii”输出。这很好,Android应用程序可以很好地下载并显示。问题来自第二个问题 由于JSON易于包含非英语字符(重音、标点符号等),因此我在Python中将其输出为“utf-16”。我正在Android应用程序中下载以下内容: new DownloadTask(ne

我正在将我们的iOS应用程序转换为Android(第一次使用Android,但使用了很长时间的Java程序员)。有一个web服务为应用程序提供2个JSON提要。这个web服务是用Python编写的,第一个JSON字符串作为“ascii”输出。这很好,Android应用程序可以很好地下载并显示。问题来自第二个问题

由于JSON易于包含非英语字符(重音、标点符号等),因此我在Python中将其输出为“utf-16”。我正在Android应用程序中下载以下内容:

new DownloadTask(new Downloader.Callback() {
        @Override
        public void finishedDownloading(String content) {

            final City[] cities = new Gson().fromJson(content, City[].class);
            Downloader.cities = cities;
            System.out.println("Found " + cities.length + " cities");
            getActivity().runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    setListAdapter(new CityArrayAdapter(getActivity(),
                            R.layout.listview_item_row,
                            cities));
                    pb.dismiss();
                }
            });
        }
    }).execute(Constants.CITIES_URL);
下载任务:

protected String doInBackground(String... sUrl) {
    BufferedReader br = null;
    try {
        URL url = new URL(sUrl[0]);
        br = new BufferedReader(new InputStreamReader(url.openStream()));
        String line = br.readLine();
        String doc = "";
        while (line != null) {
            doc += line + "\r\n";
            line = br.readLine();
        }
        br.close();
        callback.finishedDownloading(doc);

        return doc;
    } catch (MalformedURLException e) {
        System.out.println("Exception: " + e.getMessage());
    } catch (IOException e) {
        System.out.println("Exception: " + e.getMessage());
    }
    return null;
}
我一直在阅读Java是如何处理字符串的,很明显,字符串是以UTF-16的形式存储的,所以我不知道为什么它不能正常工作


关于错误,Gson抛出了一个错误,但这只是因为字符串显示不正确。当我将url响应打印到控制台时,每隔一个字符就会显示一个“?”(表示编码错误)。

您的问题是InputStreamReader。您应该明确地告诉它要使用什么字符集,而不是使用平台默认值,这不是您想要的。理想情况下,您应该读取内容类型标题,并使用该标题选择硬编码utf-16(LE或be?)的字符集intead

为了澄清您对Java内部使用utf-16的想法,您是正确的,但问题是您需要将字节转换为字符,而这与Java内部如何处理字符串无关

此外,您可能需要考虑使用utf-8,因为这往往是web上默认的unicode编码