Android 4.0 WebView 使用loadData加载网页乱码之解决办法

来源:互联网 发布:种子 知乎 编辑:程序博客网 时间:2024/06/05 06:43
android 4.0以上的版本,Webview若使用loadData会出现中文乱码

解决办法:

使用loadDataWithBaseURL方法

原因:

请看loadData和loadDataWithBaseURL区别

首先,从方法的定义来看:

public void  loadData(String data, String mimeType, String encoding) 
public void  loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl)

loadDataWithBaseURL()比loadData()多两个参数,可以指定HTML代码片段中相关资源的相对根路径,也可以指定历史Url,两个方法的其余三个参数相同。

其次,两个方法加载的HTML代码片段有些不同

loadData()中的html 代码中不能包含'#', '%', '\', '?'四中特殊字符,这就为我们内嵌css样式等制造了麻烦,因为css中经常用'#', '%'等字符,需要如何处理呢?我们需要用UrlEncoder编码为#, %, ', ? ,所以loadData需要对这些特殊字符进行转换,而loadDataWithBaseURL不需要转换。

loadData() 中特殊字符的转换方法:

StringBuilder buf = new StringBuilder(html.length());
   for (char c : html.toCharArray()) {
       switch (c) {
         case '#':  buf.append("#"); break;
         case '%':  buf.append("%"); break;
         case '\'': buf.append("'"); break;
         case '?':  buf.append("?"); break;               
         default:
           buf.append(c);
           break;
       }
   }
 
loadDataWithBaseURL 使用方法:

StringBuilder data = new StringBuilder("<html><body bgcolor=\"#F2F6F8\">");  
            int size = paperList.size();  
            for(int i = 0;i < size;i++){  
                if(!StringUtils.isEmpty(paperList.get(i).getFilePath())){  
                    data.append("<center>").append("<img src = \"file://"+paperList.get(i).getFilePath()+"\">").append("</center><br>");  
                }  
                data.append("<center>").append("<font color=\"#000000\">"+paperList.get(i).getContent()+"</font>").append("</center><br><br>");  
            }  
            data.append("</body></html>");  
webView.loadDataWithBaseURL("", data, "text/html", "UTF-8","");  
原创粉丝点击