2010-10-18 19 views
91

E 'possibile utilizzare seguente metodo per l'impostazione del contenuto di un web-view loadData (dati String, String mimeType, String encoding)Android. WebView e loadData

Come gestire il problema con la sconosciuta codifica dei dati html ?!

C'è una lista di codifiche ?!

So dal mio college che nel mio caso html proviene da DB ed è codificato con latin-1. Provo a impostare il parametro di codifica su latin-1, su ISO-8859-1/iso-8859-1, ma ho ancora problemi con la visualizzazione di segni speciali come ä, ö, ü.

Sarò molto grato per qualsiasi consiglio.

risposta

117

WebView.loadData() non funziona correttamente. Quello che dovevo fare era:

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

Credo che nel tuo caso è necessario sostituire UTF-8 con latin1 o ISO-8859-1 sia nell'intestazione e nel WebView.loadData().

E, per dare una risposta completa, ecco la lista ufficiale delle codifiche: http://www.iana.org/assignments/character-sets

posso aggiornare la mia risposta per essere più inclusiva:

Per utilizzare WebView.loadData() con codifiche non latin1 si deve codifica il contenuto html. Nell'esempio precedente non funzionava correttamente in Android 4+, così ho modificato farlo sembrare come segue:

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

} 

Ma in seguito ho passato a WebView.loadDataWithBaseURL() e il codice è diventato molto pulito e non in base alla versione di Android:

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

Per qualche motivo queste funzioni hanno un'implementazione completamente diversa.

+1

Privet, Andrey. Ho provato la tua soluzione. Purtroppo non ha funzionato per me :( – Tima

+0

Hai provato UTF-8 come ho descritto? Ora quando penso alla tua domanda mi viene in mente che in Java tutte le stringhe sono in UTF-8, quindi il mio esempio dovrebbe funzionare intatto. –

+0

Tutte le stringhe sono UTF-8, ma il testo proveniente dal server è in latino 1. Penso, ho provato con UTF-8 e con latin-1 e con ISO-8859-1, ma ho visto ancora strani segni invece di ü , ma, ma ho un'altra idea, proverò a convertire il flusso di byte dal server in una stringa usando la codifica giusta, forse, questo mi aiuterà – Tima

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

Questo funziona perfettamente, in particolare su Android 4.0, che ignora quanto pare codifica dei caratteri all'interno HTML.

Testato su 2.3 e 4.0.3.

In effetti, non ho idea di quali altri valori oltre a "base64" faccia l'ultimo parametro. Alcuni esempi di Google mettono nulla lì dentro.

+1

Questo non può funzionare" perfettamente "se si dispone di caratteri al di fuori del set di caratteri US-ASCII. –

+1

Solo provato su un dispositivo 4.2.2 e funziona come un incantesimo, ma su un dispositivo 2.3.6 mostra solo gli stessi caratteri inutili.: S – Frank

+0

Questo funziona anche per me in 4.1.2 (che ignora anche charset all'interno HTML), e con una codifica Latin1! Vai figura. –

1

le risposte sopra non funzionano nel mio caso. È necessario specificare utf-8 in meta tag

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

Da quanto ho capito, loadData() genera semplicemente un data: URL con i dati forniscono esso.

Leggere il javadocs per loadData():

Se il valore del parametro di codifica è 'base64', quindi i dati devono essere codificati come base64.In caso contrario, i dati devono utilizzare la codifica ASCII per gli ottetti all'interno dell'intervallo di caratteri URL sicuri e utilizzare la codifica standard% xx hex di URL per ottetti esterni a tale intervallo. Per esempio, '#', '%', '\', '?' dovrebbe essere sostituito da% 23,% 25,% 27,% 3f rispettivamente.

L'URL di schema "dati" formato da questo metodo utilizza il set di caratteri US-ASCII predefinito. Se è necessario impostare un set di caratteri diverso, è necessario creare un URL di schema "dati" che specifichi esplicitamente un parametro charset nella porzione mediatype dell'URL e richiamare invece loadUrl (String). Si noti che il set di caratteri ottenuto dalla porzione mediatype di un URL di dati sovrascrive sempre quello specificato nel documento HTML o XML stesso.

Pertanto, è necessario utilizzare US-ASCII e sfuggire a eventuali caratteri speciali, o semplicemente codificare tutto utilizzando Base64. Il seguente dovrebbe funzionare, a patto di utilizzare UTF-8 (non ho ancora testato questo 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

Questo mi ha ricordato di controllare la documentazione prima di vagare ovunque! – Pradeep

+0

Grazie per la risposta! Stava caricando diversi built-in di aiuto html contestuale in una visualizzazione Web, e ha funzionato solo un po 'di tempo. Questo l'ha risolto – eric

15

ho questo problema, ma:

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

non funziona in tutti i dispositivi. E unisco alcuni metodi:

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

È funziona! :) Grazie

+0

Grazie! Le sue opere –

+1

'" ";' dovrebbe essere '" ";' – Zen

+0

@Zen Destra :) Copia-incolla è male :) –

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 questo: String customHtml = text;

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

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