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

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

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

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

如果尝试这一个,我不会得到任何显示在所有

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

问候

58319 次浏览

在加载数据之前,您可以尝试编辑 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");

我不知道在加载那个页面之前你在做什么。这种安全性的改变会不会与此有关?你以前从网上下载过页面吗?

后1.0的说明。由于 WebKit 中的更改,通过子资源的“ file:///android _ asset/”访问资产文件受到更多限制。如果将 null 或空字符串作为 baseUrl 提供,则无法访问资产文件。如果 baseUrl 不是 http (s)/ftp (s)/about/javascript as scheme,那么您可以访问子资源的资产文件。

从这里摘录: < a href = “ http://developer.android.com/reference/android/webkit/WebView.html”rel = “ nofollow”> http://developer.android.com/reference/android/webkit/webview.html 在方法“ loadDataWithBaseURL”部分。

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

您需要交换前两个参数

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

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

这似乎已经在某种形式或时尚永远被打破。 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 文档

最新版本的 Android

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

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

You can also use this formulation with 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 仍然没有解决这个基本问题。

德尔祖的观点在上述方面非常有帮助:

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

in the wv.loadUrlWhatever() call. Excellent attention to detail, Derzu

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

但是,您可以使用 <meta>标记指定内容编码:

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

And then load it into WebView using mWebView.loadUrl("file:///android_asset/om.html");. It should display the non-latin characters as you expect.

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

A combination of the two seems to work for me. For some reason it likes null on the encoding and the charset in the mime type :/ 真奇怪,这解决了我几个月来的烦恼。

You should keep 3 things in mind to show the right content always:

  1. 使用 loadDataWithBaseUrl 而不是 loadData 函数。
  2. 将 html 文件中的正确编码设置为 meta 标记
  3. Setting defaultTextEncodingName in WebSettings

例子已经通过其他答案提供,所以我不重复!

mwebView.loadData(URLEncoder.encode(data, "utf-8").replaceAll("\\+"," "), "text/html", "utf-8");