使用WebView的loadData编码问题

时间:2011-10-02 10:58:55

标签: android encoding webview

我正在使用

在WebView中加载一些包含latin-1字符的数据
String uri = Uri.encode(html);
webview.loadData(uri, "text/html", "ISO-8859-1");

显示时,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>

8 个答案:

答案 0 :(得分:52)

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

这完美无瑕,特别是在Android 4.0上,显然忽略了内部 HTML中的字符编码。

在2.3和4.0.3上测试。

实际上,我不知道除了“base64”之外的其他值是什么。一些Google示例在那里放置了null。

您应始终使用UTF-8编码。多年来,其他所有字符编码都已经过时了。

答案 1 :(得分:34)

只有这样才能让它正常工作,如评论here

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

没有URI编码,utf-8 ... loadData错误?

答案 2 :(得分:14)

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

解决问题的方法之一。

答案 3 :(得分:7)

我显示©2011,它正在显示©。

使用以下代码,我已达到显示正确值©2011

webViewContent.loadDataWithBaseURL(null, html, "text/html", "utf-8", null);

答案 4 :(得分:1)

webView.loadDataWithBaseURL(null, html, "text/html", "utf-8", null); 

答案 5 :(得分:0)

AFAIK: 首先,loadData()方法用于加载原始html代码。
其次,只需将html代码直接放到loadData()中,不要编码为

您可能想尝试这样:

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

干杯!

答案 6 :(得分: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。

答案 7 :(得分:0)

  

来自Java文档的有关loadData方法的信息

     

使用“数据”方案URL将给定数据加载到此WebView中。

     

请注意,JavaScript的相同源策略意味着运行的脚本   使用此方法加载的页面将无法访问内容   使用“数据”以外的任何方案加载,包括“http(s)”。至   避免这种限制,使用loadDataWithBaseURL()与适当的   基本URL。

     

encoding参数指定数据是base64还是URL   编码。如果数据是base64编码的,则为编码值   参数必须是'base64'。对于参数的所有其他值,   包括null,假设数据使用ASCII编码   八位字节在安全URL字符范围内并使用标准   %xx对该范围之外的八位字节的URL的十六进制编码。例如,   '#','%','\','?'应该被%23,%25,%27,%3f取代   分别。

     

此方法形成的“数据”方案URL使用默认的US-ASCII   字符集。如果您需要设置不同的字符集,您应该形成   一个'数据'方案URL,它明确指定了一个charset参数   URL的mediatype部分,而是调用loadUrl(String)。   请注意,字符集是从数据的mediatype部分获得的   URL始终覆盖HTML或XML文档中指定的URL   本身。

以下代码为我工作。

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