У меня проблема с загрузкой и анализом веб-страницы 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 (), но у меня проблемы с длиной ...

Некоторые идеи? Спасибо!

3
Daniel Argüelles 29 Авг 2011 в 20:49

2 ответа

Лучший ответ

Вам нужно использовать 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();
// ...

Не связанный с конкретной проблемой, рассматривали ли вы возможность использования парсера HTML, такого как Jsoup? Мы учтем эти неприятные детали. Тогда это так просто, как

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

Однако на самом деле это не позволяет подключать монитор прогресса.

1
BalusC 29 Авг 2011 в 17:39

Я почти уверен, что вы не хотите использовать DataInputStream.

Однако этот ответ может быть полезным: Чтение / преобразование InputStream в строку

1
Community 23 Май 2017 в 11:43