回答:
myWebView.loadData(myHtmlString, "text/html; charset=UTF-8", null);
これは、特にAndroid 4.0で問題なく機能します。これは明らかに文字エンコーディングを無視します。 HTML内のをます。
2.3および4.0.3でテスト済み。
実際、「base64」以外のどの値が最後のパラメーターをとるのか私にはわかりません。いくつかのGoogleの例では、そこにnullを入れています。
WebView.loadDataWithBaseURL()
WebView.loadData()が正しく機能していません。私がしなければならなかったことは:
String header = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>";
myWebView.loadData(header+myHtmlString, "text/html", "UTF-8");
あなたの場合、ヘッダーとWebView.loadData()の両方でUTF-8をlatin1またはISO-8859-1に置き換える必要があると思います。
そして、完全な答えを与えるために、ここにエンコーディングの公式リストがあります:http : //www.iana.org/assignments/character-sets
私は私の答えをより包括的になるように更新します:
latin1以外のエンコーディングでWebView.loadData()を使用するには、htmlコンテンツをエンコードする必要があります。前の例はAndroid 4以降では正しく機能しなかったため、次のように変更しました。
WebSettings settings = myWebView.getSettings();
settings.setDefaultTextEncodingName("utf-8");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO) {
String base64 = Base64.encodeToString(htmlString.getBytes(), Base64.DEFAULT);
myWebView.loadData(base64, "text/html; charset=utf-8", "base64");
} else {
String header = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>";
myWebView.loadData(header + htmlString, "text/html; charset=UTF-8", null);
}
しかし、後でWebView.loadDataWithBaseURL()に切り替えて、コードが非常にクリーンになり、Androidのバージョンに依存しなくなりました。
WebSettings settings = myWebView.getSettings();
settings.setDefaultTextEncodingName("utf-8");
myWebView.loadDataWithBaseURL(null, htmlString, "text/html", "utf-8", null);
何らかの理由で、これらの関数の実装は完全に異なります。
私が理解しているように、loadData()
単にdata:
、データが提供するURLをです。
のjavadocを読んでくださいloadData()
:
encodingパラメータの値が 'base64'の場合、データはbase64としてエンコードする必要があります。それ以外の場合、データは、安全なURL文字の範囲内のオクテットに対してASCIIエンコーディングを使用し、その範囲外のオクテットに対してURLの標準の%xx 16進エンコーディングを使用する必要があります。例えば、 '#'、 '%'、 '\'、 '?' それぞれ%23、%25、%27、%3fに置き換える必要があります。
このメソッドによって形成される「データ」スキームのURLは、デフォルトのUS-ASCII文字セットを使用します。別の文字セットを設定する必要がある場合は、URLのメディアタイプ部分で文字セットパラメータを明示的に指定する「データ」スキームURLを作成し、代わりにloadUrl(String)を呼び出す必要があります。データURLのメディアタイプ部分から取得された文字セットは、HTMLまたはXMLドキュメント自体で指定された文字セットを常にオーバーライドすることに注意してください。
したがって、US-ASCIIを使用して特殊文字をエスケープするか、Base64を使用してすべてをエンコードする必要があります。以下は、UTF-8を使用していることを前提として機能するはずです(私はこれをlatin1でテストしていません)。
String data = ...; // the html data
String base64 = android.util.Base64.encodeToString(data.getBytes("UTF-8"), android.util.Base64.DEFAULT);
webView.loadData(base64, "text/html; charset=utf-8", "base64");
私はこの問題を抱えていますが、
String content = "<html><head><meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" /></head><body>";
content += mydata + "</body></html>";
WebView1.loadData(content, "text/html", "UTF-8");
すべてのデバイスで機能するわけではありません。そして、いくつかのメソッドをマージします:
String content =
"<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"+
"<html><head>"+
"<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" />"+
"</head><body>";
content += myContent + "</body></html>";
WebView WebView1 = (WebView) findViewById(R.id.webView1);
WebView1.loadData(content, "text/html; charset=utf-8", "UTF-8");
できます。
これを使用してください:String customHtml = text;
wb.loadDataWithBaseURL(null,customHtml,"text/html", "UTF-8", null);
最も安全な WebビューでhtmlContentをロードする方法は、以下のとおりです。
「Base64エンコーディング」は公式の推奨事項であり、Chrominiumの最新の01/2019バグ(WebView M72(72.0.3626.76)に存在)で再度記述されています(Javadocにすでに存在):
https://bugs.chromium.org/p/chromium/issues/detail?id=929083
Chromiumチームの公式声明:
「推奨される修正:
Base64でデータをエンコードすることをお勧めします。その方法の例を以下に示します。
この修正は下位互換性があり(以前のWebViewバージョンで動作します)、将来も保証されます(コンテンツのエンコードに関して将来の互換性の問題が発生することはありません)。 "
コードサンプル:
webView.loadData(
Base64.encodeToString(
htmlContent.getBytes(StandardCharsets.UTF_8),
Base64.DEFAULT), // encode in Base64 encoded
"text/html; charset=utf-8", // utf-8 html content (personal recommendation)
"base64"); // always use Base64 encoded data: NEVER PUT "utf-8" here (using base64 or not): This is wrong!