Android下载UTF-8网页出现字符集问题

3
我遇到了一个下载和解析UTF-8网页的问题...我使用下面的函数获取网页HTML:

```

static String getString(String url, ProgressDialog loading) {
    String s = "", html = "";
    HttpURLConnection conn = null;
    try {
        conn = (HttpURLConnection) new URL(url).openConnection();
        conn.setRequestProperty("Content-Type", "text/plain; charset=utf-8");
        conn.setConnectTimeout(5000);
        conn.setReadTimeout(5000);
        conn.connect();
        DataInputStream dis = new DataInputStream(conn.getInputStream());
        loading.setTitle("Descargando...");
        loading.setMax( 32000 );
        while ((s = dis.readLine()) != null) {
            html += s;
            loading.setProgress(html.length());
        }
    } catch (Exception e) {
        Log.e("CC", "Error al descargar: " + e.getMessage());

    } finally {
        if (conn != null)
            conn.disconnect();
    }
    return html;
}

这个网页包含:

<meta http-equiv="content-type" content="text/html; charset=UTF-8" />

但是在应用程序中,西班牙语的元素如:¡ ¿ á é í ó ú 显示错误。我尝试使用 readUTF(),但遇到了长度问题...

有什么建议吗?谢谢!

2个回答

1

您需要使用一个Reader,在其中指定用于读取输入流的字符集。在这种特殊情况下,您需要一个InputStreamReader

Reader reader = null;
StringBuilder builder = new StringBuilder();

try {
    // ...
    reader = new InputStreamReader(connection.getInputStream(), "UTF-8");
    char[] buffer = new char[8192];

    for (int length = 0; (length = reader.read(buffer)) > 0;) {
        builder.append(buffer, 0, length);
        loading.setProgress(length);
    }
} finally {
    if (reader != null) try { reader.close(); } catch (IOException logOrIgnore) {}
}

String html = builder.toString();
// ...

与具体问题无关,你考虑过使用像Jsoup这样的HTML解析器吗?它会考虑到这些繁琐的细节。然后就像这样简单了

String html = Jsoup.connect(url).get().html();
// ...

然而,它并不真正允许附加进度监视器。


Jsoup确实更快、更轻巧...但是什么更好呢?速度和轻便还是向用户显示加载进度?这是个难决定的问题 :) - Daniel Argüelles
1
如果您打算从HTML中提取数据,我肯定会选择Jsoup。它具有类似于jQuery的CSS选择器支持,使提取变得非常容易:http://jsoup.org/cookbook/extracting-data/selector-syntax - BalusC
非常好...我会尝试使用Jsoup!! 再次感谢 :) - Daniel Argüelles
Jsoup 下载速度更快,但我有类似的问题,我得到了 ´ 而不是 á... - Daniel Argüelles
1
这是HTML规范所要求的。如果您想获取数据的文本表示,您需要使用Element#text()。但是,每当您要在HTML页面中重新显示它时,Element#html()应该完美地工作。 - BalusC

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接