2011-10-02 71 views
21

我使用編碼問題用的WebView loadData

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

顯示時,latin1的字符被奇怪的字符替換加載一些數據,包括latin1的字符,在網頁視圖。

如果我直接在一個TextView(只是爲了測試)加載HTML,正確顯示拉丁字符。

有人可以幫忙嗎?

由於

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

您的設備可以支持的字體? – xDragonZ

+0

@xDragonZ我不確定你的意思,但它是一個星系,我可以看到拉丁字符。 – jul

+0

可能是[Android的重複。 WebView和loadData](http://stackoverflow.com/questions/3961589/android-webview-and-loaddata) – ForceMagic

回答

34

只有這樣,纔能有工作,作爲評論here

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

沒有URI編碼,UTF-8 ... loadData錯誤?

+0

我覺得這個線程提出了一個更優雅的解決方案:http://stackoverflow.com/questions/7412763/string- encoding-problem-in-webview – Sparky

+0

它的工作原理..感謝很多... –

+0

我無法使用任何這些方法顯示反轉感嘆號(¡,¡,¡)。有誰知道如何解決這個問題? –

0

AFAIK在於: 首先,loadData()方法被用於加載原始HTML代碼。
其次,只是把HTML代碼直接到loadData(),不編碼它

你可能想嘗試這樣的:

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

乾杯!

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

這完美的作品,尤其是在Android 4.0,這顯然忽略了內部 HTML字符編碼

測試2.3和4.0.3。

事實上,我也沒有什麼,除了「BASE64」其他值確實最後一個參數拿的主意。一些Google示例在那裏放置了null。

您應該始終使用UTF-8編碼。其他字符編碼已經過時很多年了。

+0

這是一個有趣的黑客...但在Android 4.3上適合我!謝謝! – Chiubaka

+0

謝謝,確實很棒。在Android 4.4.2上測試OK。 –

+0

字符串在Java中採用Unicode格式,我如何使用utf-8編碼它? – Shawn

7

我有顯示©2011年和它顯示©。

隨着下面的代碼我已經實現顯示正確的值©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); 

之一的問題的解決方案。

+0

這是唯一對我有用的東西。解碼\ u字符(如\ u016​​b等) – Rooster242

+0

謝謝,這對我很有用。 –

0

我也曾經有過在這裏和那裏得到一個奇怪的字符像的問題。嘗試了不同的選擇,但有效的是低於。

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是WebView。約loadData方法Java文檔

0

信息

加載一個給定的數據轉換成用「數據」方案URL這個網頁視圖。

需要注意的是JavaScript的同源策略意味着腳本在運行 使用此方法加載的頁面將無法訪問使用比「數據」以外的任何方案加載的內容 ,包括「HTTP(S)」。至 請避免此限制,請將loadDataWithBaseURL()與適當的 基本URL一起使用。

編碼參數指定數據是base64還是編碼爲URL 。如果數據是base64編碼的,則編碼 參數的值必須是'base64'。對於參數 的所有其他值(包括空值),假定數據在安全URL字符範圍內對 八位位組使用ASCII編碼,並對該範圍以外的八位位組使用標準的 %xx十六進制URL編碼。例如, '#','%','\','?'應分別替換爲%23,%25,%27,%3f 。

此方法形成的'data'scheme URL使用默認的US-ASCII 字符集。如果您需要設置不同的字符集,則應該在 URL的mediatype部分中顯式指定字符集參數,然後調用loadUrl(String),而不是形成 'data'scheme URL。 請注意,從數據 URL的媒體類型部分獲取的字符集總是會覆蓋HTML或XML文檔 本身中指定的字符集。

以下代碼適用於我。

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