Answers:
myWebView.loadData(myHtmlString, "text/html; charset=UTF-8", null);
这完美无瑕,尤其是在Android 4.0上,后者显然忽略了HTML 内部的字符编码。
经过2.3和4.0.3测试。
实际上,我不知道最后一个参数除了“ base64”之外还需要其他什么值。Google的一些示例在其中放置了null。
WebView.loadDataWithBaseURL()
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);
由于某些原因,这些功能的实现方式完全不同。
据我了解,loadData()
只需生成一个data:
URL并提供数据即可。
阅读的javadoc为loadData()
:
如果encoding参数的值为'base64',则数据必须编码为base64。否则,数据必须对安全URL字符范围内的八位字节使用ASCII编码,并对超出该范围的八位字节使用标准的URL%xx十六进制编码。例如, '#', '%', '\', '?' 应分别替换为%23,%25,%27和%3f。
通过此方法形成的“数据”方案URL使用默认的US-ASCII字符集。如果需要设置其他字符集,则应形成一个“数据”方案URL,该URL在mediatype部分中显式指定一个charset参数,然后调用loadUrl(String)。请注意,从数据URL的媒体类型部分获得的字符集始终会覆盖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");
我有这个问题,但是:
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");
有用。
在Web视图中加载htmlContent 的最安全方法是:
“ Base64编码”是一项官方建议,已在Chrominium的最新01/2019 bug(存在于WebView M72(72.0.3626.76))中再次写过(已经在Javadoc中提供):
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!
webview.loadDataWithBaseURL(null,文本,“ text / html”,“ UTF-8”,null);