Android 安卓WebView和loadData

Android 安卓WebView和loadData,android,encoding,webview,Android,Encoding,Webview,可以使用以下方法设置web视图的内容 loadData(字符串数据、字符串mimeType、字符串编码) 如何处理html数据未知编码的问题 有编码列表吗 我从大学里知道,在我的例子中,html来自DB,用拉丁语1编码。 我尝试将编码参数设置为latin-1,设置为ISO-8859-1/ISO-8859-1,但仍然无法显示像ä,ö,ü这样的特殊符号 我将非常感谢您的建议。WebView.loadData()完全不能正常工作。我要做的是: String header = "<?xml ver

可以使用以下方法设置web视图的内容 loadData(字符串数据、字符串mimeType、字符串编码)

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

有编码列表吗

我从大学里知道,在我的例子中,html来自DB,用拉丁语1编码。 我尝试将编码参数设置为latin-1,设置为ISO-8859-1/ISO-8859-1,但仍然无法显示像ä,ö,ü这样的特殊符号

我将非常感谢您的建议。

WebView.loadData()完全不能正常工作。我要做的是:

String header = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>";
myWebView.loadData(header+myHtmlString, "text/html", "UTF-8");
由于某些原因,这些函数具有完全不同的实现

myWebView.loadData(myHtmlString, "text/html; charset=UTF-8", null);
这是完美的,尤其是在Android 4.0上,它显然忽略了HTML内部的字符编码

在2.3和4.0.3中测试


事实上,我不知道最后一个参数除了“base64”之外还有什么其他值。一些谷歌的例子在这里输入空值。

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

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

据我所知,
loadData()
只需生成一个
数据:
URL,并提供数据

读取
loadData()

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

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

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


我有这个问题,但是:

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");
字符串内容=”;
content+=mydata+“”;
WebView1.loadData(内容,“文本/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");
字符串内容=
""+
""+
""+
"";
内容+=myContent+“”;
WebView WebView1=(WebView)findViewById(R.id.WebView1);
WebView1.loadData(内容,“text/html;charset=utf-8”、“utf-8”);
它可以工作。

使用以下方法:
 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);
字符串customHtml=文本

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

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

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

  • 使用base64编码(官方建议)
  • 为html内容类型指定UFT-8,即“text/html;charset=utf-8”而不是“text/html”(个人建议)
  • “Base64编码”是一项官方建议,已在Chrominium最新的2019年1月bug中再次编写(已在Javadoc中出现)(出现在WebView M72(72.0.3626.76)中):

    铬团队的官方声明:

    “建议修复:
    我们的团队建议您使用Base64对数据进行编码。我们提供了如何进行编码的示例:

    • API文档:
    • 视频谈话:(跳到时间戳9:58)
    此修复程序是向后兼容的(它适用于早期的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! 
    

    女贞,安德烈。我试过你的解决办法。不幸的是,它对我不起作用:(您是否如我所述尝试过UTF-8?现在,当我思考您的问题时,我突然想到,在Java中,所有字符串都是UTF-8,因此我的示例应该可以完整地工作。所有字符串都是UTF-8,但来自服务器的文本都是拉丁语-1。我想,我尝试过UTF-8、拉丁语-1和ISO-8859-1,但仍然看到奇怪的符号,而不是ü,ö,ä)。但我有另一个想法,我将尝试使用正确的编码将服务器上的字节流转换为字符串。也许,这将有助于我将4.0+编码也设置为mime类型“text/html;chartset=utf-8”,否则将无法识别最后一个代码段(带有loadDataWithBaseURL的代码段)在4.2.2和2.3.6设备上都非常有效:数据这无法工作如果你有US-ASCII字符集以外的字符,“完美无瑕”。刚刚在4.2.2设备上试用过,效果像一个符咒,但在2.3.6设备上它只显示相同的垃圾字符。:s这也适用于我在4.1.2(他也忽略HTML中的字符集)中的工作,并使用拉丁1编码!如图所示。@Frank same,在HTC one 2.3.7上测试过(可能都是姜饼)并且得到了同样的垃圾,我必须使用Andrey Novikov解决方案和
    WebView。根据谷歌的建议,loadDataWithBaseURL()
    base64是必需的。在这里阅读更多内容,并查看谷歌的视频!(我答案中的链接;-)这提醒我在到处闲逛之前要检查文档!谢谢你的回答!在webview中加载了不同的内置上下文html帮助,并且只在一段时间内有效。这已经解决了问题。15稍后发布,这是唯一一个对meThis有效的方法。这不是Google推荐的方法。请查看我的答案并查看视频对话;-)
     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);
    
               wb.loadDataWithBaseURL(null,customHtml,"text/html", "UTF-8", null);
    
    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!