Android系统。 WebView和loadData

时间:2010-10-18 17:19:53

标签: android encoding webview

可以使用以下方法进行内容的Web视图设置 loadData(String data,String mimeType,String encoding)

如何处理未知的html数据编码问题?!

是否有编码列表?!

我从大学知道,在我的情况下,html来自数据库,并使用latin-1编码。 我尝试将编码参数设置为latin-1,设置为ISO-8859-1 / iso-8859-1,但仍然有显示ä,ö,ü等特殊标志的问题。

我会非常感谢任何建议。

9 个答案:

答案 0 :(得分:202)

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

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

在2.3和4.0.3上测试。

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

答案 1 :(得分:127)

WebView.loadData()根本无法正常工作。我必须做的是:

String header = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>";
myWebView.loadData(header+myHtmlString, "text/html", "UTF-8");

我认为在你的情况下你应该在头文件和WebView.loadData()中用latin1或ISO-8859-1替换UTF-8。

并且,为了给出完整的答案,这是正式的编码列表:http://www.iana.org/assignments/character-sets

我更新我的回答是为了更具包容性:

要将WebView.loadData()与非latin1编码一起使用,您必须对html内容进行编码。之前的示例在Android 4+中无法正常工作,因此我将其修改为如下所示:

WebSettings settings = myWebView.getSettings();
settings.setDefaultTextEncodingName("utf-8");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO) {
    String base64 = Base64.encodeToString(htmlString.getBytes(), Base64.DEFAULT);
    myWebView.loadData(base64, "text/html; charset=utf-8", "base64");
} else {
    String header = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>";
    myWebView.loadData(header + htmlString, "text/html; charset=UTF-8", null);

}

但后来我切换到WebView.loadDataWithBaseURL(),代码变得非常干净,不依赖于Android版本:

WebSettings settings = myWebView.getSettings();
settings.setDefaultTextEncodingName("utf-8");
myWebView.loadDataWithBaseURL(null, htmlString, "text/html", "utf-8", null);

由于某些原因,这些功能的实现完全不同。

答案 2 :(得分:34)

据我了解,loadData()只是生成data:网址,并提供数据。

阅读loadData()的{​​{3}}:

  

如果encoding参数的值为'base64',则必须将数据编码为base64。否则,数据必须对安全URL字符范围内的八位字节使用ASCII编码,并对该范围外的八位字节使用URL的标准%xx十六进制编码。例如, '#', '%', '\', '?'应分别由%23,%25,%27,%3f代替。

     

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

因此,您应该使用US-ASCII并自行转义任何特殊字符,或者只使用Base64对所有字符进行编码。假设您使用UTF-8(我没有使用latin1测试过),以下内容应该可以正常工作:

String data = ...;  // the html data
String base64 = android.util.Base64.encodeToString(data.getBytes("UTF-8"), android.util.Base64.DEFAULT);
webView.loadData(base64, "text/html; charset=utf-8", "base64");

答案 3 :(得分:18)

我有这个问题,但是:

String content = "<html><head><meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" /></head><body>";
content += mydata + "</body></html>";
WebView1.loadData(content, "text/html", "UTF-8");

不适用于所有设备。我合并了一些方法:

String content = 
       "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"+
       "<html><head>"+
       "<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" />"+
       "</head><body>";

content += myContent + "</body></html>";

WebView WebView1 = (WebView) findViewById(R.id.webView1);
WebView1.loadData(content, "text/html; charset=utf-8", "UTF-8");

有效。

答案 4 :(得分:5)

使用这个:  String customHtml = text;

           wb.loadDataWithBaseURL(null,customHtml,"text/html", "UTF-8", null);

答案 5 :(得分:4)

 String strWebData="html...." //**Your html string**

 WebView webDetail=(WebView) findViewById(R.id.webView1);

 WebSettings websetting = webDetail.getSettings();

 websetting.setDefaultTextEncodingName("utf-8");

 webDetail.loadData(strWebData, "text/html; charset=utf-8", null);

答案 6 :(得分:1)

上述答案在我的案例中不起作用。您需要在元标记中指定utf-8

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    </head>
    <body>
        <!-- you content goes here -->
    </body>
</html>

答案 7 :(得分:1)

在Web视图中加载htmlContent的最安全的方法是:

  1. 使用base64编码(官方推荐)
  2. 为HTML内容类型指定UFT-8,即“ text / html; charset = utf-8”,而不是“ text / html”(个人建议)

已在最新的Chrominium 01/2019 bug(在WebView M72(72.0.3626.76)中出现)中再次编写(已在Javadoc中提供)的Base64编码正式建议:

https://bugs.chromium.org/p/chromium/issues/detail?id=929083

Chromium小组的官方声明:

“推荐的解决方案:
我们的团队建议您使用Base64对数据进行编码。我们提供了有关操作方法的示例:

此修补程序是向后兼容的(它在早期的WebView版本上可用),并且还应是面向未来的(关于内容编码,您将来不会遇到兼容性问题。”

代码示例:

webView.loadData(
    Base64.encodeToString(
        htmlContent.getBytes(StandardCharsets.UTF_8),
        Base64.DEFAULT), // encode in Base64 encoded 
    "text/html; charset=utf-8", // utf-8 html content (personal recommendation)
    "base64"); // always use Base64 encoded data: NEVER PUT "utf-8" here (using base64 or not): This is wrong! 

答案 8 :(得分:-1)

webview.loadDataWithBaseURL(null,text,“text / html”,“UTF-8”,null);