Проблема кодирования с loadData WebView - PullRequest
21 голосов
/ 02 октября 2011

Я загружаю некоторые данные, содержащие символы латинского алфавита 1, в WebView, используя

String uri = Uri.encode(html);
webview.loadData(uri, "text/html", "ISO-8859-1");

При отображении символы латинского алфавита заменяются странными символами.

Если я загружаю HTML непосредственно в TextView (только для проверки), латинские символы отображаются правильно.

Кто-нибудь может помочь?

Спасибо

HTML:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

    <!-- some html -->

</html>

Ответы [ 8 ]

52 голосов
/ 23 февраля 2012
myWebView.loadData(myHtmlString, "text/html; charset=UTF-8", null);

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

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

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

Вы всегда должны использовать кодировку UTF-8. Все остальные кодировки уже давно устарели.

34 голосов
/ 02 октября 2011

Единственный способ заставить это работать, как прокомментировано здесь :

webview.loadDataWithBaseURL("fake://not/needed", html, "text/html", "utf-8", "");

Нет кодировки URI, utf-8 ... ошибка loadData?

14 голосов
/ 13 декабря 2012
String start = "<html><head><meta http-equiv='Content-Type' content='text/html' charset='UTF-8' /></head><body>";
String end = "</body></html>";

webcontent.loadData(start+ YOURCONTENT + end, "text/html; charset=UTF-8", null);

Одно из решений проблемы.

7 голосов
/ 23 мая 2012

У меня есть дисплей © 2011, и он отображал ©.

С помощью приведенного ниже кода я достиг правильного значения © 2011

webViewContent.loadDataWithBaseURL(null, html, "text/html", "utf-8", null);
1 голос
/ 26 ноября 2013
webView.loadDataWithBaseURL(null, html, "text/html", "utf-8", null); 
0 голосов
/ 06 сентября 2013

Информация из документов Java о методе loadData

Загружает данные в это WebView, используя URL-адрес схемы «data».

Обратите внимание, что та же политика происхождения JavaScript означает, что сценарий, выполняемый на странице, загруженной с помощью этого метода, не сможет получить доступ к содержимому, загруженному с использованием любой схемы, кроме 'data', включая 'http (s)'.Чтобы избежать этого ограничения, используйте loadDataWithBaseURL () с соответствующим базовым URL.

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

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

Следующий код работал для меня.

String base64EncodedString = null;
                        try {
                            base64EncodedString = android.util.Base64.encodeToString((preString+mailContent.getBody()+postString).getBytes("UTF-8"), android.util.Base64.DEFAULT);
                        } catch (UnsupportedEncodingException e1) {
                            // TODO Auto-generated catch block
                            e1.printStackTrace();
                        }
                        if(base64EncodedString != null)
                        {
                            wvMailContent.loadData(base64EncodedString, "text/html; charset=utf-8", "base64");  
                        }
                        else
                        {
                            wvMailContent.loadData(preString+mailContent.getBody()+postString, "text/html; charset=utf-8", "utf-8");
0 голосов
/ 08 февраля 2013

У меня тоже была проблема с получением странного персонажа вроде Â здесь и там.Пробовал разные варианты, но тот, который работал, ниже.

String style_sheet_url = "http://something.com/assets/css/layout.css";
    String head = "<head> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />" + 
            "<link rel=\"stylesheet\" type=\"text/css\" href=\"" + style_sheet_url + "\" /></head>";    
    String locdata = "<html xmlns=\"http://www.w3.org/1999/xhtml\">" + head + "<body>"+ data + "</body></html>";
    wv_news_text.loadData(locdata, "text/html", "utf-8");

wv_news_text - это WebView.

0 голосов
/ 02 октября 2011

AFAIK, что: Во-первых, метод loadData () используется для загрузки необработанного HTML-кода.
Во-вторых, просто поместите HTML-код непосредственно в loadData (), не кодируйте его

Возможно, вы захотите попробовать вот так:

webview.loadData(uri, "text/html", "ISO-8859-1");

ура!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...