可以使用以下方法设置 web-view 的内容: loadData(String data, String mimeType, String encoding)
如何处理 html 数据的未知编码问题?!
是否有编码列表?!
我从我的大学了解到,在我的情况下,html 来自数据库并使用 Latin-1 编码。 我尝试将编码参数设置为 latin-1、ISO-8859-1 / iso-8859-1,但仍然无法正确显示特殊符号,如 ä、ö、ü。
非常感谢任何建议。
myWebView.loadData(myHtmlString, "text/html; charset=UTF-8", null);
这个方案完美运行,尤其是在 Android 4.0 上,它显然忽略了 HTML 中内部的字符编码。
已在2.3和4.0.3上测试。
事实上,我不知道除了“base64”之外,最后一个参数还能取什么值。一些谷歌的例子中将其设置为 null。
WebView.loadData()根本无法正常工作。我所做的是:
String header = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>";
myWebView.loadData(header+myHtmlString, "text/html", "UTF-8");
我认为在你的情况下,你应该在标题和WebView.loadData()中将UTF-8替换为latin1或ISO-8859-1。为了给出一个完整的答案,这里是官方编码列表:http://www.iana.org/assignments/character-sets
我更新了我的答案以包容更多:
要使用非latin1编码的WebView.loadData(),您必须对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。loadData()
的Javadocs: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");
它有效。
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!
);
使用以下代码:
String customHtml = text;
wb.loadDataWithBaseURL(null,customHtml,"text/html", "UTF-8", null);
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);
以上的答案在我的情况下不起作用。你需要在 meta 标签中指定 utf-8
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<!-- you content goes here -->
</body>
</html>
这是快速且有效的 // 数据 = 任何HTML或数学字符串
public void putInWebview(String data, WebView wv) {
String htmlstring = "<head><meta name='viewport' content='width=device-width, shrink-to-fit=YES' user-scalable='no'><script type=\"text/x-mathjax-config\">MathJax.Hub.Config({tex2jax: {inlineMath: [['\\(','\\)']],processEscapes: true},\"HTML-CSS\": { linebreaks: { automatic: true, width: \"container\" } } } )</script><script id=\"MathJax-script\" async src=\"https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.js\" ></script></head>" +
"<body style=\"font-size:100%; font-family: Arial \" > " + data + "</body></html>";
String qstnencodedHtml = Base64.encodeToString(htmlstring.getBytes(), Base64.NO_PADDING);
if (Build.VERSION.SDK_INT >= 19) {
wv.setLayerType(View.LAYER_TYPE_HARDWARE, null);
}
else {
wv.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}
wv.getSettings().setJavaScriptEnabled(true);
wv.loadData(qstnencodedHtml, "text/html", "base64");
}
WebView.loadDataWithBaseURL()
。 - ForceMagic