Android WebView con caracteres UTF-8 ilegibles.

Estoy usando algunas vistas web en mi aplicación de Android, pero no puedo mostrarlas en encoding utf-8.

Si utilizo este no veré mis charcters escandinavos:

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

Y si prueba este, no mostraré nada

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

Saludos

Puede intentar editar la configuración de su vista web antes de cargar los datos:

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

Además, como se indica en el comentario siguiente, asegúrese de agregar "charset=utf-8" a la llamada loadData:

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

Esto parece haberse roto de alguna forma o moda para siempre. Número 1733

Use loadDataWithBaseURL en lugar de 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); 

Ahora la parte que es verdaderamente molesta es que en el Samsung Galaxy S II (4.0.3) loadData () funciona bien, pero probando en el Galaxy Nexus (4.0.2) los caracteres de múltiples bytes son ilegibles a menos que uses loadDataWithBaseURL ( ) Documentación de WebView

Versiones recientes de Android

Algunos informan un cambio en el comportamiento de las llamadas loadData que requieren que mimeType incluya charset=utf-8 .

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

También puede usar esta formulación con 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); 

Es sorprendente que Android todavía no haya resuelto este problema básico.

El bit de Derzu es muy útil arriba:

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

Tenía utf-8 en Adroid 2.xy angustia ansi en 4.x hasta que puse el

  charset=utf-8 

en la llamada wv.loadUrlWhatever (). Excelente atención al detalle, Derzu

Hay dos formas en que una página HTML entregada por un servidor HTTP puede especificar la encoding del contenido. Por lo general, el servidor especificará la encoding del contenido en los encabezados HTTP, pero dado que esta página se está cargando desde un archivo, no hay ninguna transacción HTTP y, por lo tanto, no hay encabezados. Como resultado, WebView asume una encoding predeterminada de Latin-1.

Sin embargo, puede especificar una encoding de contenido usando la etiqueta . Construya su archivo html así:

     Title  Your content following 

Y luego cárguelo en WebView usando mWebView.loadUrl("file:///android_asset/om.html"); . Debería mostrar los caracteres no latinos como esperabas.

 WebView wv = (WebView) findViewById(R.id.rowWebview); WebSettings settings = wv.getSettings(); settings.setDefaultTextEncodingName("utf-8"); wv.loadData(topHtml, "text/html; charset=utf-8",null); 

Una combinación de los dos parece funcionar para mí. Por alguna razón, le gusta nulo en la encoding y el juego de caracteres en el tipo de mime: / raro. esto ha solucionado meses de agravación para mí.

Necesitas intercambiar tus dos primeros argumentos. Ver este tema: Android WebView UTF-8 no se muestra

Entonces su código debería verse así:

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

No estoy seguro de lo que estás haciendo antes de cargar esa página. ¿Podría este cambio de seguridad tener algo que ver con eso? ¿Está cargando la página desde la web antes?

Nota para la publicación 1.0. Debido al cambio en el WebKit, el acceso a los archivos de activos a través de “file: /// android_asset /” para los recursos secundarios es más restringido. Si proporciona una cadena vacía o nula como baseUrl, no podrá acceder a los archivos de activos. Si el baseUrl no es http (s) / ftp (s) / about / javascript como esquema, puede acceder a los archivos de recursos para los recursos secundarios.

Tomado desde aquí: http://developer.android.com/reference/android/webkit/WebView.html En la sección sobre el método “loadDataWithBaseURL”.

¿Puedes usar “loadData” para una prueba rápida? Especifique “utf-8” para la encoding y pegado de un carácter escandinavo en el parámetro de datos. Prueba simple para eliminar el problema de seguridad.

Debes tener 3 cosas en mente para mostrar el contenido correcto siempre:

  1. Usando loadDataWithBaseUrl en lugar de loadData funciton.
  2. Establecer la encoding correcta en el archivo html como una metaetiqueta
  3. Establecer defaultTextEncodingName en WebSettings

¡Los ejemplos han sido provistos a través de otras respuestas, así que no repito!

 mwebView.loadData(URLEncoder.encode(data, "utf-8").replaceAll("\\+"," "), "text/html", "utf-8");