android webview loaddata乱码问题
webView直接调用webView.loadData(data, mimeType, encoding);方法,如果data中有中文会显示乱码。
String data = "测试中文yingwing";
String encoding = "utf-8";
String mimeType = "text/html";
解决方法:
1、设置webview默认编码
webView.getSettings().setDefaultTextEncodingName(encoding);
2、改用:loadDataWithBaseURL()方法,具体参数如下
webView.loadDataWithBaseURL(null,data, mimeType, encoding,null);
原因(别人博客copy url:http://blog.sina.com.cn/s/blog_4b93170a0102e0e9.html)
请看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","");
守护