【问题标题】:Android WebView with garbled UTF-8 characters.带有乱码 UTF-8 字符的 Android WebView。
【发布时间】:2011-06-23 09:57:40
【问题描述】:

我在我的 android 应用程序中使用了一些 webview,但无法使它们以 utf-8 编码显示。

如果使用这个,我将看不到我的斯堪的纳维亚字符:

mWebView.loadUrl("file:///android_asset/om.html")

如果试试这个,我什么都不会显示

mWebView.loadDataWithBaseURL("file:///android_asset/om.html", null, "text/html", "utf-8",null);

问候

【问题讨论】:

  • 虽然这是 android-webview-utf-8-not-showing 的副本,但 2010 年接受的解决方案不适用于较新的 android 版本。 @Cameron Lowell Palmer 和 @R Earle Harris 在这个问题中的答案包含适用于较新的 android 版本的信息
  • 没错,它是相似的,但不是重复的,这代表了一个更强的一般问题和答案。请投票重新开放。
  • Elena sys 看来您结束这个问题有点自私。这里的答案比您的答案评分更高,正是因为问题足够不同且答案更强。
  • 这是一个重复的问题:stackoverflow.com/questions/3312643/…
  • @Elenasys 不同意。它很相似,但有很大不同。

标签: android webview utf


【解决方案1】:

您可以在加载数据之前尝试编辑 webview 的设置:

WebSettings settings = mWebView.getSettings();
settings.setDefaultTextEncodingName("utf-8");

另外,正如下面评论中所提供的,请务必将 "charset=utf-8" 添加到 loadData 调用中:

mWebView.loadData(getString(R.string.info_texto), "text/html; charset=utf-8", "utf-8");

【讨论】:

  • 这不会像我的回答中描述的那样工作。问题是方法中的一个错误,在必要时指定 UTF-8 编码并不是您需要做的全部。
  • 这适用于 Android 2.2,但要使其也适用于 Android 4.04,您需要使用 loadDataWithBaseURL() 方法 suggested by Cameron
  • 这适用于我在 android 2.2.1, 4.0.4, 4.1.2 上。您还需要在 loadData 调用中添加“charset=utf-8”。像这样:webview.loadData(getString(R.string.info_texto), "text/html; charset=utf-8", "utf-8");
【解决方案2】:

我不确定您在加载该页面之前在做什么。这种安全变化与它有什么关系吗?您之前是否从网络加载页面?

1.0 后的注意事项。由于WebKit的变化,子资源通过“file:///android_asset/”访问asset文件受到了更多限制。如果您提供 null 或空字符串作为 baseUrl,您将无法访问资产文件。如果 baseUrl 不是 http(s)/ftp(s)/about/javascript 作为方案,您可以访问子资源的资产文件。

取自这里:http://developer.android.com/reference/android/webkit/WebView.html 在方法“loadDataWithBaseURL”部分。

您可以使用“loadData”代替快速测试吗?指定“utf-8”进行编码并将斯堪的纳维亚字符粘贴到数据参数中。消除安全问题的简单测试。

【讨论】:

    【解决方案3】:

    您需要交换前两个参数。看到这个帖子:Android WebView UTF-8 not showing

    所以你的代码应该是这样的:

    mWebView.loadDataWithBaseURL(null, "file:///android_asset/om.html", "text/html", "utf-8",null);
    

    【讨论】:

    • 根据文档正确的顺序是:public void loadDataWithBaseURL (String baseUrl, String data, String mimeType, String encoding, String historyUrl)
    • 是的,文档是正确的。我的回答考虑到了这一点。基本 URL 是需要为空的。
    • 事实上,您的有效负载是一个带有 file:// 的字符串,通过我关闭。
    【解决方案4】:

    这似乎已经以某种形式或方式永远被破坏了。 Issue 1733

    使用 loadDataWithBaseURL 代替 loadData。

    // Pretend this is an html document with those three characters
    String scandinavianCharacters = "øæå";
    
    // Won't render correctly
    webView.loadData(scandinavianCharacters, "text/html", "UTF-8");
    
    // Will render correctly
    webView.loadDataWithBaseURL(null, scandinavianCharacters, "text/html", "UTF-8", null);
    

    现在真正令人讨厌的是,在三星 Galaxy S II (4.0.3) 上 loadData() 工作得很好,但在 Galaxy Nexus (4.0.2) 上测试多字节字符是乱码,除非你使用 loadDataWithBaseURL()。 WebView Documentation

    Android 的最新版本

    有些报告要求 mimeType 包含 charset=utf-8 的 loadData 调用的行为发生了变化。

    webView.loadData(scandinavianCharacters, "text/html; charset=utf-8", "UTF-8");
    

    您也可以将此公式与WebSettings 一起使用

    WebView webView = (WebView) findViewById(R.id.DemoWebView);
    WebSettings webSettings = webView.getSettings();
    webSettings.setDefaultTextEncodingName("utf-8");  
    webView.loadData(scandinavianCharacters, "text/html; charset=utf-8", null);
    

    令人惊讶的是,Android 仍然没有解决这个基本问题。

    【讨论】:

    • 谢谢。为我工作得很好。
    • 谢谢,在我的 Galaxy S3 上运行良好。虽然很烦人。
    • 我无法使用这些方法中的任何一种来显示倒置感叹号(¡、¡、¡)。有谁知道如何解决这个问题?
    • 我使用的是 android 4.4.4 并没有为我工作。 text/html; charset=utf-8 工作。
    • 很高兴能有一个明确的答案来确定这改变了哪个 API 级别。在三星 Galaxy S3 (API 16) 上进行测试时,“text/html; charset=utf-8”会导致文本出现乱码,而“text/html”可以正常工作。在 Moto G (API 23) 上是相反的。我已经使用 if (Build.VERSION.SDK_INT > 16) 来选择编码字符串,但我担心这仍然不适用于所有设备/ API 级别
    【解决方案5】:

    Derzu 的一点在上面很有帮助:

    webview.loadData(getString(R.string.info_texto), "text/html; charset=utf-8", "utf-8");
    

    我在 Android 2.x 上使用 UTF-8,在 4.x 上使用 ANSI 乱码,直到我输入

     charset=utf-8
    

    wv.loadUrlWhatever() 电话中。非常注重细节,Derzu

    【讨论】:

    【解决方案6】:

    HTTP 服务器提供的 HTML 页面可以通过两种方式指定内容编码。通常,服务器会在 HTTP 标头中指定内容编码,但由于此页面是从文件加载的,因此没有 HTTP 事务,因此没有标头。因此,WebView 假定默认编码为 Latin-1。

    但是,您可以使用<meta> 标记指定内容编码。构造你的 html 文件:

    <!DOCTYPE HTML>
    <html>
    <head>
        <meta http-equiv="content-type" content="text/html; charset=UTF-8">
        <title>Title</title>
    </head>
    Your content following
    

    然后使用mWebView.loadUrl("file:///android_asset/om.html"); 将其加载到WebView 中。它应该按您的预期显示非拉丁字符。

    【讨论】:

    • 这个解决方案是我需要的,因为我通过文件加载 html 内容。谢谢:D
    【解决方案7】:
    WebView wv = (WebView) findViewById(R.id.rowWebview);
    WebSettings settings = wv.getSettings();
    settings.setDefaultTextEncodingName("utf-8");                   
    wv.loadData(topHtml, "text/html; charset=utf-8",null);
    

    两者的结合似乎对我有用。出于某种原因,它喜欢在 mime 类型中的编码和字符集为 null :/ 诡异的。这解决了我几个月的烦恼。

    【讨论】:

    • 是的,只有“utf-8”的这两个设置对我也有帮助。 meta 标签 &lt;meta http-equiv="content-type" content="text/html; charset=UTF-8"&gt; 在我使用 loadUrl 时只是有所帮助,但在使用 loadData 时被忽略(在 API 16 + 21 上测试)。
    【解决方案8】:

    您应该记住 3 件事以始终显示正确的内容:

    1. 使用 loadDataWithBaseUrl 代替 loadData 函数。
    2. 在 html 文件中将正确的编码设置为元标记
    3. 在 WebSettings 中设置 defaultTextEncodingName

    示例已通过其他答案提供,因此我不再重复!

    【讨论】:

    【解决方案9】:
    mwebView.loadData(URLEncoder.encode(data, "utf-8").replaceAll("\\+"," "), "text/html", "utf-8");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-11
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-09
      相关资源
      最近更新 更多