2010-10-18 27 views
91

Es posible utilizar siguiente método para el ajuste del contenido de un web-vista loadData (datos String, String mimeType, serie de codificación)Android. WebView y loadData

Cómo manejar el problema con la codificación desconocida de datos HTML ?!

¿Hay una lista de codificaciones ?!

Sé por mi universidad que en mi caso html viene de DB y está codificado con latin-1. Intento establecer el parámetro de codificación en latin-1, en ISO-8859-1/iso-8859-1, pero todavía tengo problemas para mostrar signos especiales como ä, ö, ü.

Estaré muy agradecido por cualquier consejo.

Respuesta

117

WebView.loadData() no funciona correctamente en absoluto. Lo que tenía que hacer era:

String header = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"; 
myWebView.loadData(header+myHtmlString, "text/html", "UTF-8"); 

Creo que en su caso se debe reemplazar UTF-8 con latin1 o ISO-8859-1, tanto en la cabecera y en WebView.loadData().

Y, para dar una respuesta completa, aquí está la lista oficial de codificaciones: http://www.iana.org/assignments/character-sets

puedo actualizar mi respuesta sea más inclusiva:

Para utilizar WebView.loadData() con codificaciones no latin1 que tienen que codificar contenido html ejemplo anterior no funcionaba correctamente en Android 4+, así que he modificado que se vea de la siguiente manera:

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

} 

Pero después me he cambiado a WebView.loadDataWithBaseURL() y el código se hizo muy limpio y no en función de la versión de Android:

WebSettings settings = myWebView.getSettings(); 
settings.setDefaultTextEncodingName("utf-8"); 
myWebView.loadDataWithBaseURL(null, htmlString, "text/html", "utf-8", null); 

Por alguna razón, estas funciones tienen una implementación completamente diferente.

+1

Privet, Andrey. He intentado tu solución. Desafortunadamente no funcionó para mí :( – Tima

+0

¿Has probado UTF-8 como lo describí? Ahora cuando pienso en tu pregunta, se me ocurre que en Java todas las cadenas están en UTF-8, así que mi ejemplo debería funcionar intacto. –

+0

Todas las cadenas son UTF-8, pero el texto procedente del servidor está en latin-1. Creo que lo intenté con UTF-8 y con latin-1 y con ISO-8859-1, pero vi señales extrañas en lugar de ü , ö, ä. Pero tengo otra idea, intentaré convertir el flujo de bytes del servidor a cadena usando la codificación correcta. Tal vez, eso me ayudará – Tima

194
myWebView.loadData(myHtmlString, "text/html; charset=UTF-8", null); 

Esto funciona a la perfección, especialmente en Android 4.0, que aparentemente ignora la codificación de caracteres dentro HTML.

Probado en 2.3 y 4.0.3.

De hecho, no tengo idea de qué otros valores además de "base64" toma el último parámetro. Algunos ejemplos de Google ponen null allí.

+1

Esto no puede funcionar" sin problemas "si tiene caracteres fuera del juego de caracteres US-ASCII. –

+1

Sólo probado en un dispositivo 4.2.2 y funciona como un hechizo, pero en un dispositivo 2.3.6 solo muestra los mismos caracteres basura. S – Frank

+0

Esto también me funciona en 4.1.2 (que también ignora el juego de caracteres dentro de HTML), y con una codificación Latin1! Vaya figura. –

1

las respuestas anteriores no funcionan en mi caso. Es necesario especificar UTF-8 en la etiqueta meta

<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
    </head> 
    <body> 
     <!-- you content goes here --> 
    </body> 
</html> 
31

Como yo lo entiendo, loadData() simplemente genera una URL data: con los datos proporcionan la misma.

Leer la javadocs para loadData():

Si el valor del parámetro de codificación es 'base64', entonces los datos deben ser codificados como base64.De lo contrario, los datos deben usar codificación ASCII para octetos dentro del rango de caracteres URL seguros y usar la codificación hexadecimal% xx estándar de URL para octetos fuera de ese rango. Por ejemplo, '#', '%', '\', '?' debe ser reemplazado por% 23,% 25,% 27,% 3f respectivamente.

La URL del esquema 'datos' formada por este método usa el juego de caracteres US-ASCII predeterminado. Si necesita establecer un juego de caracteres diferente, debe formar un esquema URL de datos que especifique explícitamente un parámetro de juego de caracteres en la porción de tipo de medio de la URL y llame a loadUrl (String) en su lugar. Tenga en cuenta que el conjunto de caracteres obtenido de la parte del tipo de medio de una URL de datos siempre anula la especificada en el documento HTML o XML.

Por lo tanto, debe usar US-ASCII y escapar de los caracteres especiales usted mismo, o simplemente codificar todo utilizando Base64. El siguiente debería funcionar, suponiendo que el uso de UTF-8 (no he probado esto con 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"); 
+0

Esto me recordó revisar la documentación antes de deambular por todas partes. – Pradeep

+0

¡Gracias por la respuesta! Estaba cargándose una ayuda contextual html diferente en una vista web, y solo funcionaba algunas veces. Esto lo ha arreglado. – eric

15

tengo este problema, pero:

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

no funciona en todos los dispositivos. Y combino algunos métodos:

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

¡Es trabajos! :) Gracias

+0

Gracias! Sus trabajos –

+1

'" ";' deberían ser '" ";' – Zen

+0

@Zen Right :) Copiar y pegar es malo :) –

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

uso esto: cadena customHtml = texto;

  wb.loadDataWithBaseURL(null,customHtml,"text/html", "UTF-8", null); 
-1

webview.loadDataWithBaseURL (null, texto, "text/html", "UTF-8", null);