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());
loadDataWithBaseURL 使用方法:
StringBuilder data = new StringBuilder("<html><body bgcolor=\"#F2F6F8\">");
webView.loadDataWithBaseURL("", data, "text/html", "UTF-8","");
使用 loadData方法是中文部分会出现乱码,即使指定“utf-8”、“gbk”、“gb2312”也一样。
webView.getSettings().setDefaultTextEncodingName("UTF -8");//设置默认为utf-8 // webView.loadData(data, "text/html", "UTF -8");//API提供的标准用法,无法解决乱码问题 webView.loadData(data, "text/html; charset=UTF-8", null);//这种写法可以正确解码
或者考虑使用 loadDataWithBaseURL方法