78

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

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

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

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

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

问候

4

9 回答 9

157

您可以在加载数据之前尝试编辑 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");
于 2011-02-08T13:03:40.347 回答
135

这似乎已经以某种形式或方式永远被打破了。 第 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( )。Web 视图文档

最新版本的 Android

一些报告要求mimeType包含的 loadData 调用的行为发生了变化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 仍然没有解决这个基本问题。

于 2012-05-31T10:05:48.877 回答
27

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

于 2013-04-16T19:04:15.950 回答
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

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

于 2013-04-28T07:50:12.097 回答
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 类型中的字符集:/ 奇怪。这解决了我几个月的烦恼。

于 2013-10-08T22:08:29.770 回答
2

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

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

mWebView.loadDataWithBaseURL(null, "file:///android_asset/om.html", "text/html", "utf-8",null);
于 2012-02-24T00:42:36.047 回答
1

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

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

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

于 2014-07-06T14:20:25.857 回答
0

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

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”进行编码并将斯堪的纳维亚字符粘贴到数据参数中。消除安全问题的简单测试。

于 2011-02-08T13:13:17.087 回答
0
mwebView.loadData(URLEncoder.encode(data, "utf-8").replaceAll("\\+"," "), "text/html", "utf-8");
于 2015-04-24T09:19:00.587 回答