Android WebView с искаженными символами UTF-8. - PullRequest
72 голосов
/ 08 февраля 2011

Я использую некоторые веб-просмотры в своем приложении для Android, но не могу заставить их отображаться в кодировке utf-8.

Если использовать это, я не увижу свои скандинавские символы:

mWebView.loadUrl("file:///android_asset/om.html")

И если вы попробуете это, у меня вообще ничего не отобразится

mWebView.loadDataWithBaseURL("file:///android_asset/om.html", null, "text/html", "utf-8",null);

С уважением

Ответы [ 9 ]

148 голосов
/ 08 февраля 2011

Вы можете попробовать отредактировать настройки вашего веб-просмотра перед загрузкой данных:

WebSettings settings = mWebView.getSettings();
settings.setDefaultTextEncodingName("utf-8");

Также, как указано в комментарии ниже, обязательно добавьте "charset=utf-8" к вызову loadData:

mWebView.loadData(getString(R.string.info_texto), "text/html; charset=utf-8", "utf-8");
125 голосов
/ 31 мая 2012

Это, кажется, было сломано в некоторой форме или моде навсегда. Выпуск 1733

Использование loadDataWithBaseURL вместо loadData.

// Pretend this is an html document with those three characters
String scandinavianCharacters = "øæå";

// Won't render correctly
webView.loadData(scandinavianCharacters, "text/html", "UTF-8");

// Will render correctly
webView.loadDataWithBaseURL(null, scandinavianCharacters, "text/html", "UTF-8", null);

Теперь действительно раздражает то, что в Samsung Galaxy S II (4.0.3) loadData() работает отлично, но при тестировании на Galaxy Nexus (4.0.2) многобайтовые символы искажаются, если вы не используете loadDataWithBaseURL (). Документация WebView

Последние версии Android

Некоторые сообщают об изменении в поведении вызовов loadData, требующих mimeType для включения charset=utf-8.

webView.loadData(scandinavianCharacters, "text/html; charset=utf-8", "UTF-8");

Вы также можете использовать эту формулировку с WebSettings

WebView webView = (WebView) findViewById(R.id.DemoWebView);
WebSettings webSettings = webView.getSettings();
webSettings.setDefaultTextEncodingName("utf-8");  
webView.loadData(scandinavianCharacters, "text/html; charset=utf-8", null);

Удивительно, что Android до сих пор не решил эту основную проблему.

27 голосов
/ 16 апреля 2013

Бит Дерзу очень полезен выше:

webview.loadData(getString(R.string.info_texto), "text/html; charset=utf-8", "utf-8"); 

У меня был utf-8 на Adroid 2.x и искаженный ansi на 4.x, пока я не вставил

 charset=utf-8

в вызове wv.loadUrlWh независимо ().Отличное внимание к деталям, Derzu

12 голосов
/ 28 апреля 2013

Существует два способа, которыми HTML-страница, предоставляемая HTTP-сервером, может задавать кодировку содержимого. Обычно сервер указывает кодировку содержимого в заголовках HTTP, но поскольку эта страница загружается из файла, транзакция HTTP отсутствует и, следовательно, заголовки отсутствуют. В результате WebView предполагает кодировку по умолчанию Latin-1.

Однако вы можете указать кодировку содержимого с помощью тега <meta>. Создайте свой HTML-файл следующим образом:

<!DOCTYPE HTML>
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title>Title</title>
</head>
Your content following

А затем загрузите его в WebView, используя mWebView.loadUrl("file:///android_asset/om.html");. Он должен отображать нелатинские символы, как вы ожидаете.

9 голосов
/ 09 октября 2013
WebView wv = (WebView) findViewById(R.id.rowWebview);
WebSettings settings = wv.getSettings();
settings.setDefaultTextEncodingName("utf-8");                   
wv.loadData(topHtml, "text/html; charset=utf-8",null);

Комбинация из двух, кажется, работает для меня.По какой-то причине ему нравится null в кодировке и charset в типе mime: / weird.это решило месяцы обострения для меня.

2 голосов
/ 24 февраля 2012

Вам нужно поменять первые два аргумента. См. Эту тему: Android WebView UTF-8 не отображается

Итак, ваш код должен выглядеть так:

mWebView.loadDataWithBaseURL(null, "file:///android_asset/om.html", "text/html", "utf-8",null);
0 голосов
/ 24 апреля 2015
mwebView.loadData(URLEncoder.encode(data, "utf-8").replaceAll("\\+"," "), "text/html", "utf-8");
0 голосов
/ 06 июля 2014

Необходимо всегда помнить 3 вещи, чтобы всегда показывать правильный контент:

  1. Использование loadDataWithBaseUrl вместо loadData funciton.
  2. Установка правильной кодировки в html-файле в качестве мета-тега
  3. Установка defaultTextEncodingName в WebSettings

Примеры предоставлены с помощью других ответов, поэтому я не повторюсь!

0 голосов
/ 08 февраля 2011

Я не уверен, что вы делаете перед загрузкой этой страницы. Может ли это изменение безопасности иметь какое-либо отношение к нему? Вы загружаете страницу из Интернета раньше?

Примечание для поста 1.0. Из-за изменений в WebKit доступ к файлам ресурсов через «file: /// android_asset /» для подресурсов более ограничен. Если вы предоставите пустую или пустую строку как baseUrl, вы не сможете получить доступ к файлам активов. Если baseUrl отличается от http (s) / ftp (s) / about / javascript в качестве схемы, вы можете получить доступ к файлам ресурсов для подресурсов.

взято отсюда: http://developer.android.com/reference/android/webkit/WebView.html В разделе о методе «loadDataWithBaseURL».

Можете ли вы использовать «loadData» вместо этого для быстрого теста? Укажите «utf-8» для кодирования и вставки скандинавского символа в параметр данных. Простой тест для устранения проблемы безопасности.

...