Android. WebView и loadData

Можно использовать следующий метод настройки контента веб-представления loadData (String data, String mimeType, String encoding)

Как справиться с проблемой с неизвестной кодировкой данных html?!

Есть ли список кодировок?!

Я знаю из своего колледжа, что в моем случае html поступает из БД и кодируется латинским-1. Я пытаюсь установить параметр кодирования в латинский-1, в ISO-8859-1/iso-8859-1, но все еще имею проблему с отображением специальных знаков, таких как ä, ö, ü.

Буду очень благодарен за любые советы.

Ответ 1

myWebView.loadData(myHtmlString, "text/html; charset=UTF-8", null);

Это работает безупречно, особенно на Android 4.0, который, по-видимому, игнорирует кодировку символов внутри.

Протестировано на 2.3 и 4.0.3.

На самом деле, я понятия не имею, какие другие значения, кроме "base64", выполняет последний параметр. В некоторых примерах Google помещается нуль.

Ответ 2

WebView.loadData() работает некорректно. Что мне нужно было сделать:

String header = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>";
myWebView.loadData(header+myHtmlString, "text/html", "UTF-8");

Я думаю, что в вашем случае вы должны заменить UTF-8 на latin1 или ISO-8859-1 как в заголовке, так и в WebView.loadData().

И, чтобы дать полный ответ, вот официальный список кодировок: http://www.iana.org/assignments/character-sets

Я обновляю свой ответ, чтобы быть более инклюзивным:

Чтобы использовать WebView.loadData() с кодировкой non latin1, вам нужно кодировать содержимое html. Предыдущий пример неправильно работал в Android 4+, поэтому я изменил его, чтобы выглядеть следующим образом:

WebSettings settings = myWebView.getSettings();
settings.setDefaultTextEncodingName("utf-8");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO) {
    String base64 = Base64.encodeToString(htmlString.getBytes(), Base64.DEFAULT);
    myWebView.loadData(base64, "text/html; charset=utf-8", "base64");
} else {
    String header = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>";
    myWebView.loadData(header + htmlString, "text/html; charset=UTF-8", null);

}

Но позже я переключился на WebView.loadDataWithBaseURL(), и код стал очень чистым и не зависел от версии Android:

WebSettings settings = myWebView.getSettings();
settings.setDefaultTextEncodingName("utf-8");
myWebView.loadDataWithBaseURL(null, htmlString, "text/html", "utf-8", null);

По какой-то причине эти функции имеют совершенно другую реализацию.

Ответ 3

Как я понимаю, loadData() просто генерирует URL data: с предоставленными ему данными.

Прочитайте javadocs для loadData():

Если значением параметра кодирования является "base64", данные должны быть закодированы как base64. В противном случае данные должны использовать кодировку ASCII для октетов внутри диапазона безопасных URL-адресов и использовать стандартную шестнадцатеричную кодировку% xx URL-адресов для октетов вне этого диапазона. Например, '#', '%', '\', '?' следует заменить на% 23,% 25,% 27,% 3f соответственно.

URL-адрес схемы данных, сформированный этим методом, использует кодировку US-ASCII по умолчанию. Если вам нужно установить другую кодировку, вы должны сформировать URL-адрес схемы данных, который явно указывает параметр charset в части медиатипа URL-адреса и вместо этого вызывает loadUrl (String). Обратите внимание, что кодировка, полученная из медиатипа URL-адреса данных, всегда переопределяет значение, указанное в самом документе HTML или XML.

Следовательно, вы должны либо использовать US-ASCII, либо избегать любых специальных символов самостоятельно, либо просто кодировать все, используя Base64. Следующее должно работать, если вы используете UTF-8 (я не тестировал это с помощью latin1):

String data = ...;  // the html data
String base64 = android.util.Base64.encodeToString(data.getBytes("UTF-8"), android.util.Base64.DEFAULT);
webView.loadData(base64, "text/html; charset=utf-8", "base64");

Ответ 4

У меня есть эта проблема, но:

String content = "<html><head><meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" /></head><body>";
content += mydata + "</body></html>";
WebView1.loadData(content, "text/html", "UTF-8");

не работает на всех устройствах. И я объединяю несколько методов:

String content = 
       "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"+
       "<html><head>"+
       "<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" />"+
       "</head><body>";

content += myContent + "</body></html>";

WebView WebView1 = (WebView) findViewById(R.id.webView1);
WebView1.loadData(content, "text/html; charset=utf-8", "UTF-8");

Оно работает.

Ответ 5

 String strWebData="html...." //**Your html string**

 WebView webDetail=(WebView) findViewById(R.id.webView1);

 WebSettings websetting = webDetail.getSettings();

 websetting.setDefaultTextEncodingName("utf-8");

 webDetail.loadData(strWebData, "text/html; charset=utf-8", null);

Ответ 6

используйте это:  Строка customHtml = текст;

           wb.loadDataWithBaseURL(null,customHtml,"text/html", "UTF-8", null);

Ответ 7

ответы выше не работают в моем случае. Вам нужно указать utf-8 в метатеге

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    </head>
    <body>
        <!-- you content goes here -->
    </body>
</html>

Ответ 8

webview.loadDataWithBaseURL(null, text, "text/html", "UTF-8", null);