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


76

我在Android应用中使用了一些Webview,但是无法使它们以utf-8编码显示。

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

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

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

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

问候


1
尽管这是android-webview-utf-8-的重复,但未显示2010年接受的解决方案不适用于更新的android版本。@ Cameron Lowell Palmer和@R Earle Harris在此问题中的答案包含适用于较新android版本的信息
k3b 2015年

确实,它是相似的,但不是重复的,这代表了更强的一般性问答。请投票重新开放。
卡梅隆·洛厄尔·帕尔默

Elena sys看来,您对这个问题的解决有点自私。此处的答案比您的答案获得更高的评价,这恰恰是因为问题足够不同并且答案更强。
卡梅隆·洛厄尔·帕尔默


@Elenasys不同意。它是相似的,但是足够不同。
卡梅隆·洛厄尔·帕尔默

Answers:


152

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

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

1
如我的回答所述,这将不起作用。问题是方法中的错误,并非必须要做的就是在必要时指定UTF-8编码。
卡梅伦·洛厄尔·帕尔默

2
这适用于Android 2.2,但要使其也适用于Android 4.04,则需要使用Cameron建议loadDataWithBaseURL()方法。
苏莱2012年

43
这对我适用于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”);
Derzu

128

这似乎已经永远以某种形式或方式被打破。 发行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);

现在真正令人讨厌的部分是,在Samsung Galaxy S II(4.0.3)上loadData()可以正常工作,但是在Galaxy Nexus(4.0.2)上进行测试时,除非您使用loadDataWithBaseURL( )。WebView文档

最新版本的Android

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

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仍未解决此基本问题。


1
谢谢你 为我工作得很好。
肖恩·格洛弗

1
谢谢,在我的Galaxy S3上工作正常。虽然很烦。
nspo

使用这些方法中的任何一种,我都无法显示反感叹号(¡,&#161 ;,¡)。有谁知道如何解决这个问题?
Cassio Landim

2
我正在使用android 4.4.4,对我不起作用。text/html; charset=utf-8工作了。
Azad 2015年

1
最好就此更改哪个API级别有明确的答案。在Samsung Galaxy S3(API 16)上进行测试时,“ text / html; charset = utf-8”导致文本乱码,而“ text / html”有效。在Moto G(API 23)上是另一种方式。我不得不使用if(Build.VERSION.SDK_INT> 16)选择编码字符串,但我担心这仍然无法在所有设备上使用/ API级别
QuantumTiger 2016年

27

上面的Derzu的位非常有帮助:

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

我在Adroid 2.x上使用utf-8,在4.x上使用了乱码的ansi,直到我将

 charset=utf-8

在wv.loadUrlWhatever()调用中。Derzu非常注重细节


甚至不需要Eric Nordvik描述的stackoverflow.com/a/4933345/866333的额外设置。至少不适用于4.1.2
约翰(John),

太好了:节省了我的时间
Dhruvil Patel 2014年

12

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

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


2
这个解决方案是我需要的解决方案,因为我通过文件加载了html内容。谢谢:D
Agung Pratama 2014年

9
WebView wv = (WebView) findViewById(R.id.rowWebview);
WebSettings settings = wv.getSettings();
settings.setDefaultTextEncodingName("utf-8");                   
wv.loadData(topHtml, "text/html; charset=utf-8",null);

两者的结合似乎对我有用。由于某种原因,它喜欢编码的null和mime类型的字符集:/ weird。这为我解决了数月的困扰。


是的,只有这两个“ utf-8”设置对我也有帮助。该meta标签<meta http-equiv="content-type" content="text/html; charset=UTF-8">仅在我使用时提供帮助,loadUrl但在使用时被忽略loadData(在API 16 + 21上测试)。
德克2014年

2

您需要交换前两个参数。看到这个线程:Android WebView UTF-8不显示

因此,您的代码应如下所示:

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

2
根据文档,正确的顺序是:public void loadDataWithBaseURL(字符串baseUrl,字符串数据,字符串mimeType,字符串编码,字符串historyUrl)
Cameron Lowell Palmer

是的,文档是正确的。我的回答考虑到了这一点。基本URL是必须为空的URL。
Sparky 2012年

事实是,您的有效负载是一个带有file://的字符串,这是通过我关闭的。
卡梅隆·洛厄尔·帕尔默

1

您应牢记以下三点内容,以便始终显示正确的内容:

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

这些示例是通过其他答案提供的,因此我不再重复!


您解释了如何查看包含utf-8的内容,但是如何共享包含utf-8的网址,例如以下链接(我想与社交网络共享我的应用中的Urls
Ahmad

0

我不确定在加载该页面之前您正在做什么。此安全更改可能与此有关吗?您之前是从网络加载页面吗?

1.0版的注意事项。由于WebKit的更改,子资源通过“ file:/// android_asset /”对资产文件的访问受到更多限制。如果您提供null或空字符串作为baseUrl,则将无法访问资产文件。如果baseUrl不是http / sftp / about / javascript作为方案,则可以访问资产文件以获取子资源。

取自此处:http : //developer.android.com/reference/android/webkit/WebView.html 在方法“ loadDataWithBaseURL”的部分中。

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


0
mwebView.loadData(URLEncoder.encode(data, "utf-8").replaceAll("\\+"," "), "text/html", "utf-8");
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.