Я пытаюсь отобразить некоторые данные из Java String в WebView, используя метод loadData():
wv.loadData(myString, "text/html, "utf-8");
Проблема, с которой я сталкиваюсь, заключается в том, что WebView управляет выводами символов non- ASCII (я предполагаю?). Если я использую TextView вместо WebView, эта проблема не возникает, и текст отображается правильно (хотя есть некоторая разметка HTML, поэтому TextView в конечном итоге не требуется).
Если это помогает, когда я запускаю следующий код:
for(int i = 0; i < myString.length() && i < 400; i++)
Log.i("Text", myString.charAt(i) + ": " + (int) myString.charAt(i));
символ нарушения отображается как таковой в журнале:
05- 27 13: 15: 45.110: INFO/Текст (606): â: 8217
Это проблема с набором символов, я думаю, но я не совсем уверен, как ее решить.
Вот фрагмент HTML (я не уверен, что мой работодатель разрешит полную публикацию содержимого):
Премьер-министр Туниса
Это характер, вызывающий проблему. NB: то, что я показываю, не является созданной HTML-страницей fully-.. просто текст с разметкой HTML, если это имеет значение.
У меня была аналогичная проблема, когда строка, которую я передавал в метод loadData(), не была должным образом представлена в WebView (у нее были нечетные символы вместо правильных DBCS). В моем случае строка была правильно закодирована в UTF- 8, и проблема заключалась в том, как loadData() использовала строку.
Я обнаружил, что важно указать набор символов в аргументе типа mime, а не аргумент кодирования. В частности, вызов должен был быть
wv.loadData(myString, "text/html; charset=utf-8", encoding);
В моем случае я передал null как переменную кодирования и работал (Android 4.2.1). Чтение документации API по loadData(); он, похоже, указывает, что он примет "base64", и все остальные значения приведут к тому, что аргумент данных будет рассматриваться как URL- закодированный ASCII.
Поэтому вы НЕ МОЖЕТЕ установить кодировку строки с параметром кодирования, вы должны указать кодировку в типе mime.
Try:
wv.loadData(URLEncoder.encode(myString).replace("+", "%20"), "text/html, "utf-8");
Или, если это не работает:
wv.loadData(myString, "text/html, "ISO-8859-1");
Или комбинация из двух. Один из них вообще работает для меня.