【问题标题】:Android. WebView and loadData安卓。 WebView 和 loadData
【发布时间】:2011-04-27 01:41:52
【问题描述】:

可以使用以下方法来设置网页视图的内容 loadData(String data, String mimeType, String encoding)

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

有编码列表吗?!

我从我的大学知道,在我的例子中,html 来自 DB,并使用 latin-1 编码。 我尝试将编码参数设置为 latin-1、ISO-8859-1 / iso-8859-1,但在显示 ä、ö、ü 等特殊符号时仍然存在问题。

我会非常感谢任何建议。

【问题讨论】:

    标签: android encoding webview


    【解决方案1】:

    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

    我更新了我的答案以更具包容性:

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

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

    【讨论】:

    • 女贞,安德烈。我试过你的解决方案。不幸的是,它对我不起作用:(
    • 您尝试过我描述的 UTF-8 吗?现在,当我想到您的问题时,我突然想到在 Java 中所有字符串都是 UTF-8 格式,所以我的示例应该完好无损。
    • 所有字符串都是 UTF-8,但来自服务器的文本是 latin-1。我想,我尝试使用 UTF-8、latin-1 和 ISO-8859-1,但仍然看到奇怪的符号,而不是 ü、ö、ä。但我有另一个想法,我会尝试使用正确的编码将来自服务器的字节流转换为字符串。也许,这对我有帮助
    • 在4.0+编码中也要设置mime类型"text/html; chartset=utf-8",否则无法识别
    • Last sn-p(带有 loadDataWithBaseURL 的那个)在 4.2.2 和 2.3.6 设备上都很好用:D
    【解决方案2】:
    myWebView.loadData(myHtmlString, "text/html; charset=UTF-8", null);
    

    这可以完美运行,尤其是在 Android 4.0 上,它显然忽略了 inside HTML 的字符编码。

    在 2.3 和 4.0.3 上测试。

    事实上,我不知道最后一个参数除了“base64”之外还有哪些其他值。一些 Google 示例将 null 放在那里。

    【讨论】:

    • 如果您有 US-ASCII 字符集之外的字符,这将无法“完美”工作。
    • 刚刚在 4.2.2 设备上尝试过,效果很好,但在 2.3.6 设备上,它只显示相同的垃圾字符。 :S
    • 这在 4.1.2 中也适用于我(他也忽略了 HTML 中的字符集),并且使用了 Latin1 编码!去图吧。
    • @Frank 同样在这里,在 HTC 一个 2.3.7(可能都是姜饼)上测试并得到相同的垃圾,我必须使用 Andrey Novikov 解决方案和WebView.loadDataWithBaseURL()
    • base64 是需要根据谷歌推荐的。在此处阅读更多信息stackoverflow.com/questions/3961589/… 并查看 Google 的相关视频! (我的答案中的链接;-)
    【解决方案3】:

    上面的答案在我的情况下不起作用。您需要在元标记中指定 utf-8

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

    【讨论】:

      【解决方案4】:

      据我了解,loadData() 只是生成一个 data: URL 并提供数据。

      阅读javadocs 获取loadData()

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

      此方法形成的“数据”方案 URL 使用默认的 US-ASCII 字符集。如果您需要设置不同的字符集,您应该形成一个“数据”方案 URL,它在 URL 的 mediatype 部分明确指定一个字符集参数,并改为调用 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");
      

      【讨论】:

      • 这提醒我在到处闲逛之前检查文档!
      • 感谢您的回答!在 webview 中加载不同的内置上下文 html 帮助,它只在某些时候有效。这已经解决了。
      【解决方案5】:

      我有这个问题,但是:

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

      有效。

      【讨论】:

      【解决方案6】:
       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);
      

      【讨论】:

        【解决方案7】:

        使用这个: 字符串 customHtml =text ;

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

        【讨论】:

        • 15 个帖子稍后,这是唯一对我有用的帖子
        【解决方案8】:

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

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

        “Base64 编码”是官方建议,已在 Chrominium 中的最新 01/2019 错误中再次编写(已存在于 Javadoc 中)(存在于 WebView M72 中(72.0.3626.76)):

        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! 
        

        【讨论】:

          猜你喜欢
          • 2011-05-28
          • 1970-01-01
          • 2011-06-05
          • 1970-01-01
          • 2011-06-30
          • 2018-07-05
          • 2012-01-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多