2011-10-02 16 views
21

Sto caricando alcuni dati, che contiene i caratteri latin1, in una WebView utilizzandoproblema di codifica con WebView di loadData

String uri = Uri.encode(html); 
webview.loadData(uri, "text/html", "ISO-8859-1"); 

Quando viene visualizzato, i caratteri latin1 vengono sostituiti da personaggi strani.

Se carico l'html direttamente in un TextView (solo per testare), i caratteri latini vengono visualizzati correttamente.

Chiunque può aiutare?

Grazie

html:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 

    <!-- some html --> 

</html> 
+0

Il dispositivo in grado di supportare i font? – xDragonZ

+0

@xDragonZ Non sono sicuro di cosa intendi, ma è una galassia e posso vedere personaggi latini. – jul

+0

possibile duplicato di [Android. WebView e loadData] (http://stackoverflow.com/questions/3961589/android-webview-and-loaddata) – ForceMagic

risposta

34

L'unico modo per farlo lavorare, come ha commentato here:

webview.loadDataWithBaseURL("fake://not/needed", html, "text/html", "utf-8", ""); 

No codifica URI, utf-8 ... loadData bug?

+0

Penso che questo thread proponga una soluzione più elegante: http://stackoverflow.com/questions/7412763/string- encoding-problem-in-webview – Sparky

+0

funziona ... Grazie mille ... –

+0

Non riesco a mostrare il punto esclamativo invertito (¡, ¡, ¡) utilizzando uno di questi metodi. Qualcuno sa come lavorarci? –

0

AFAIK che: In primo luogo, il metodo loadData() viene utilizzato per caricare il codice html grezzo.
In secondo luogo, appena messo il codice html direttamente al loadData(), non codificarlo

Si potrebbe desiderare di provare in questo modo:

webview.loadData(uri, "text/html", "ISO-8859-1"); 

Cheers!

49
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.

È consigliabile utilizzare sempre la codifica UTF-8. Ogni altra codifica dei caratteri è ormai obsoleta da molti anni.

+0

Questo è un trucco interessante ... ma funziona per me su Android 4.3! Grazie! – Chiubaka

+0

Grazie, davvero un grande colpo. Testato OK su Android 4.4.2. –

+0

La stringa è in formato Unicode in Java, come faccio a codificarla con utf-8? – Shawn

7

Ho display © 2011 e stava visualizzando ©.

Con il codice qui sotto ho raggiunto la visualizzazione di valore corretto © 2011

webViewContent.loadDataWithBaseURL(null, html, "text/html", "utf-8", null); 
12
String start = "<html><head><meta http-equiv='Content-Type' content='text/html' charset='UTF-8' /></head><body>"; 
String end = "</body></html>"; 

webcontent.loadData(start+ YOURCONTENT + end, "text/html; charset=UTF-8", null); 

Uno di soluzione del problema.

+0

Questa è l'unica cosa che funziona per me. Decodifica i tuoi caratteri (come \ u016b ecc.) – Rooster242

+0

Grazie, questo è un lavoro per me. –

0

Anch'io ho avuto il problema di ottenere un personaggio strano come qui e là. Ho provato diverse opzioni, ma quella che ha funzionato è sotto.

String style_sheet_url = "http://something.com/assets/css/layout.css"; 
    String head = "<head> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />" + 
      "<link rel=\"stylesheet\" type=\"text/css\" href=\"" + style_sheet_url + "\" /></head>";  
    String locdata = "<html xmlns=\"http://www.w3.org/1999/xhtml\">" + head + "<body>"+ data + "</body></html>"; 
    wv_news_text.loadData(locdata, "text/html", "utf-8"); 

wv_news_text è il WebView.

0

informazioni da documenti Java circa metodo loadData

carica i dati riportati in questo WebView utilizzando un URL schema di 'dati'.

Si noti che la politica stessa origine di JavaScript significa che lo script in esecuzione in una pagina caricata utilizzando questo metodo non sarà in grado di accedere a contenuti caricato utilizzando qualsiasi regime diverso 'dati', tra cui 'http (s)'. Per evitare questa restrizione, utilizzare loadDataWithBaseURL() con un appropriato URL di base .

Il parametro di codifica specifica se i dati sono codificati in base64 o URL . Se i dati sono codificati in base64, il valore del parametro di codifica deve essere 'base64'. Per tutti gli altri valori del parametro, compreso il valore null, si presuppone che i dati utilizzino la codifica ASCII per gli ottetti nell'intervallo di caratteri URL sicuri e utilizzano la codifica standard esadecimale xx di URL per ottetti al di fuori dell'intervallo. Ad esempio, "#", "%", "\", "?" deve essere sostituito rispettivamente da% 23,% 25,% 27,% 3f .

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

Il seguente codice ha funzionato per me.

String base64EncodedString = null; 
         try { 
          base64EncodedString = android.util.Base64.encodeToString((preString+mailContent.getBody()+postString).getBytes("UTF-8"), android.util.Base64.DEFAULT); 
         } catch (UnsupportedEncodingException e1) { 
          // TODO Auto-generated catch block 
          e1.printStackTrace(); 
         } 
         if(base64EncodedString != null) 
         { 
          wvMailContent.loadData(base64EncodedString, "text/html; charset=utf-8", "base64"); 
         } 
         else 
         { 
          wvMailContent.loadData(preString+mailContent.getBody()+postString, "text/html; charset=utf-8", "utf-8"); 
0
webView.loadDataWithBaseURL(null, html, "text/html", "utf-8", null); 
Problemi correlati