【问题标题】:Downloading a UTF-16 JSON String with Java使用 Java 下载 UTF-16 JSON 字符串
【发布时间】:2014-03-24 16:36:28
【问题描述】:

我正在将我们的 iOS 应用程序转换为 Android(第一次使用 Android,但长期从事 Java 程序员)。有一个为应用程序提供 2 个 JSON 提要的 Web 服务。此 Web 服务是用 Python 编写的,第一个 JSON 字符串输出为“ascii”。这很好,Android 应用程序可以正常下载并显示正常。问题出现在第二个问题上。

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

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 响应打印到控制台时,它会出现 '?' 每隔一个字符(表示编码错误)。

【问题讨论】:

    标签: java android json gson utf-16


    【解决方案1】:

    您的问题是 InputStreamReader。您应该明确告诉它使用什么字符集而不是使用平台默认值,这不是您想要的。理想情况下,您应该阅读 Content-Type 标头并使用它来选择硬编码 utf-16(LE 还是 BE?)的字符集。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多