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);