我正在将我们的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会抛出一个错误,但仅仅是由于String被错误地显示。当我将url响应打印到控制台时,每隔一个字符就会出现'?'(表示编码错误)。
答案 0 :(得分:2)
您的问题是InputStreamReader。您应该明确告诉它使用什么字符集而不是使用平台默认值,这不是您想要的。理想情况下,您应该阅读Content-Type标头并使用它来选择硬编码utf-16(LE或BE?)的字符集内容。
为了在内部使用utf-16澄清您对Java的看法,您是对的,但问题是您需要将字节转换为字符,而这与Java内部处理String的方式无关。
此外,您可能想要考虑使用utf-8,因为它往往是网络上的默认unicode编码。