带有乱码 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
标签 <meta http-equiv="content-type" content="text/html; charset=UTF-8">
在我使用 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编译输出中文乱码]