我正在为Android设备开发应用程序,并且在最近开发时遇到了问题。
我需要在线获取html文件的信息,所以我创建了一个InputStream和BufferedReader构造来实际扫描文件以获取信息。我将我的字符串拆分为实际获取我的信息并尝试用吐司显示它。
一切正常,我想要它的方式,但每次应该显示一个特殊字符时,一个问号哈希就是。
我认为这可能是charset的一个问题,因为该网站在:
中说<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
如何才能做到这一点?
编辑:
HttpClient httpClient = new DefaultHttpClient();
HttpPost post = new HttpPost(url);
((AbstractHttpClient) httpClient).getCredentialsProvider().setCredentials(new AuthScope(null, -1), new UsernamePasswordCredentials("user","password"));
HttpResponse response;
response = httpClient.execute(post);
BufferedReader reader = new BufferedReader(
new InputStreamReader(
response.getEntity().getContent()
)
);
String line = null;
while ((line = reader.readLine()) != null) {
Toast.makeText(this, line, Toast.LENGTH_LONG).show();
}
答案 0 :(得分:1)
InputStreamReader
实际上可能会将Charset
作为第二个参数,以表示我将要读取的流的字符编码。标准兼容的Java实现不需要使用windows-1252
编码,但我相信它与ISO-8859-1
非常相似,您可以尝试将其作为第一个解决方法来查看它是否有效。在InputStreamReader
类中还有另一个可能有趣的构造函数,将CharsetDecoder
作为第二个参数(您可以通过调用Charset.newDecoder
创建一个),您可以尝试使用它来解码流在您喜欢的编码中,或者可能在系统的默认编码中,您可以通过调用Charset.defaultCharset
获得。
有关详细信息,请参阅InputStreamReader,Charset和CharsetDecoder的JavaDoc API文档。事实上,我不是专家,我只对编码及其问题有所了解,但我认为值得指出这些类的可用性。
您还可以通过调用InputStreamReader
方法检查getEncoding
使用的编码。
答案 1 :(得分:0)
我的猜测是你刚刚使用了InputStreamReader
构造函数来获取流而不是字符编码 - 所以它会尝试使用平台默认值。您应该使用响应中指定的编码;当你使用HTTP时,Content-Type标题中的那个可能是可以的,尽管HTML可以单独指定它是一种耻辱:(
现在Android是否包含Windows-1252编码是另一回事......
答案 2 :(得分:0)
哦,无论其他地方是否解决了这个问题,请使用utf-8。 http://www.w3.org/TR/html4/charset.html http://en.wikipedia.org/wiki/UTF-8
答案 3 :(得分:0)
以防其他人遇到同样的问题...
我从我从res / raw加载的JSON文件中提取的文本中得到了相同的问号。无论我尝试什么样的流阅读组合,角色仍然会出现。我确保使用UTF-8的第一次尝试是通过Eclipse检查文件属性,并且确定它设置为“MacRoman”,无论是什么。我将它改为UTF-8,构建,运行,失败,清理,构建,运行,失败,划伤头,回到SO。
我读到我必须在更改编码后保存文件,所以我尝试了但仍然没有运气。然后我最后在Eclipse编辑器中的JSON文件中向下滚动到特殊字符的位置,有趣的是特殊字符(é和emdash)在那里也显示为黑色钻石!我删除并重新输入它们,一切正常。
底线:编码很重要,在创建资源文件(XML,JSON,CSV或其他)时,请确保在开始输入文本之前选择正确的编码(通常为UTF-8)。