带有乱码 UTF-8 字符的 Android WebView。

Posted

技术标签:

【中文标题】带有乱码 UTF-8 字符的 Android WebView。【英文标题】:Android WebView with garbled UTF-8 characters. 【发布时间】: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 看来您结束这个问题有点自私。这里的答案比您的答案评分更高,正是因为问题足够不同且答案更强。 这是一个重复的问题:***.com/questions/3312643/… @Elenasys 不同意。它很相似,但有很大不同。 【参考方案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

【讨论】:

Eric Nordvik 描述的 ***.com/a/4933345/866333 的额外设置甚至不需要。至少对于 4.1.2 来说不是 太棒了:节省了我的时间【参考方案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 件事以始终显示正确的内容:

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

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

【讨论】:

您解释了如何查看包含 utf-8 的内容,但是如何分享包含 utf-8 的 url,比如这个链接(我想在我的应用程序中与社交网络分享 Urls):yazd20.com//News/2015/11/استند-آب-كمدي-حسن-ريوندي-در-يزد.html 【参考方案9】:
mwebView.loadData(URLEncoder.encode(data, "utf-8").replaceAll("\\+"," "), "text/html", "utf-8");

【讨论】:

以上是关于带有乱码 UTF-8 字符的 Android WebView。的主要内容,如果未能解决你的问题,请参考以下文章

将带有 UTF-8 的字符从 Android 应用程序发送到服务器端

关于乱码问题的解决与HttpServletResponse中的方法

[Android]_[初级]_[AndroidStudio编译输出中文乱码]

Android 使用JSON格式与服务器交互 中文乱码问题解决

Android编译时gradle报错乱码

Android 使用Log打印日志的时候中文是乱码,怎么解决啊?