【发布时间】:2014-04-26 23:12:01
【问题描述】:
我知道围绕 SO 有很多与此类似的问题,但它们要么提供了一个非常具体的解决方案,我无法适应我的问题,要么似乎根本不起作用。
我有一个多语言应用程序,它可以从 Internet 下载某些信息并将其存储到一个文件中以供以后使用。存储是这样完成的:
public static void writeStringToFile(String string, File file)
throws IOException {
if (!file.exists()) {
file.createNewFile();
}
FileOutputStream outputStream = new FileOutputStream(file);
outputStream.write(string.getBytes("UTF-8"));
outputStream.close();
}
但后来,当读取西班牙文版本的文件时,应用程序会显示特殊字符,如 ñ,因为我尝试过:
- 在我的计算机中下载信息以检查文件是否正常并将其手动放入应用程序中,以便它从中读取而不是自行下载。文件没问题,但应用显示没有变化。
- 将getBytes的参数替换为“ISO 8859-1”,但结果的唯一不同是这次奇怪的字符是普通的问号。
- 将下载后的文件从设备复制到计算机以检查它是否正常,并且已经错误(问号位置显示“空方”字符,如果我没有显示wget 文件)。
所以我几乎可以肯定问题在于我如何编写文件,因为它可以很好地从服务器中取出但存储错误。但是我花了这么多时间研究这个方法,我找不到问题是什么……有什么线索吗?
编辑:这就是我下载信息的方式。
public static InputStream performGetRequest(String uri)
throws IOException, URISyntaxException, ServerIsCheckingException {
HttpResponse response;
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet();
request.setURI(new URI(uri));
response = client.execute(request);
if (response.getStatusLine().getStatusCode() == 409) {
throw new ServerIsCheckingException();
}
else {
return response.getEntity().getContent();
}
}
为了将其转换为稍后传递给方法 writeStringToFile 的 String 对象,我使用了
public static String inputStreamAsString(InputStream is) throws IOException {
java.util.Scanner s = new java.util.Scanner(is);
String ret;
ret = s.useDelimiter("\\A").hasNext() ? s.next() : "";
return ret;
}
我也认为 writeStringToFile 可能是问题所在,但我尝试了另一种选择,它指定要使用 UTF-8,但也没有用。
【问题讨论】:
-
也许您看到远程文件正常,但是您是否使用正确的编码下载它?你能包括下载信息的代码吗?
-
@nKn 好了,抱歉耽搁了。
-
我会尝试按照此示例将
UTF-8设置为HttpClient对象的字符集:stackoverflow.com/questions/4480363/… -
@nKn 最后我已经解决了。不仅如此,还有 Scanner 对象正在使用的字符集。请求和扫描器都使用 UTF-8(我猜是 Android 默认值),但我需要 ISO-8859-1 才能正确显示这些字符。一旦在这两种方法上指定了这个字符集,问题就得到了解决。不管怎样,你的帮助对我走上正轨很有帮助,所以如果你回答我会很高兴接受。
-
按要求完成。谢谢
标签: java android encoding character-encoding