特殊字符显示为问号标记

时间:2011-10-26 15:47:10

标签: android html string special-characters

我正在为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();
}

4 个答案:

答案 0 :(得分:1)

InputStreamReader实际上可能会将Charset作为第二个参数,以表示我将要读取的流的字符编码。标准兼容的Java实现不需要使用windows-1252编码,但我相信它与ISO-8859-1非常相似,您可以尝试将其作为第一个解决方法来查看它是否有效。在InputStreamReader类中还有另一个可能有趣的构造函数,将CharsetDecoder作为第二个参数(您可以通过调用Charset.newDecoder创建一个),您可以尝试使用它来解码流在您喜欢的编码中,或者可能在系统的默认编码中,您可以通过调用Charset.defaultCharset获得。

有关详细信息,请参阅InputStreamReaderCharsetCharsetDecoder的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)。