Webビューのコンテンツの設定に次のメソッドを使用することができますloadData(String data、String mimeType、String encoding)
Htmlデータの不明なエンコードの問題をどのように処理しますか?!
エンコーディングのリストはありますか?!
私の大学では、htmlがDBから来て、latin-1でエンコードされていることを知っています。エンコーディングパラメータをlatin-1、ISO-8859-1/iso-8859-1に設定しようとしましたが、ä、ö、üなどの特別な記号の表示に問題があります。
アドバイスをいただければ幸いです。
myWebView.loadData(myHtmlString, "text/html; charset=UTF-8", null);
これは、特に文字エンコードを無視するAndroid 4.0で問題なく動作しますinside HTML。
2.3および4.0.3でテスト済み。
実際、「base64」以外の値が最後のパラメーターにどのような値をとるかはわかりません。一部のGoogleの例では、nullが挿入されています。
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
より包括的になるように答えを更新します:
WebView.loadData() をlatin1以外のエンコーディングで使用するには、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を生成するだけです。
loadData()
の- javadocs を読んでください:
エンコードパラメーターの値が 'base64'の場合、データはbase64としてエンコードする必要があります。それ以外の場合、データは安全なURL文字の範囲内のオクテットに対してASCIIエンコードを使用し、その範囲外のオクテットに対してURLの標準%xx 16進エンコードを使用する必要があります。例えば、 '#'、 '%'、 '\'、 '?'それぞれ%23、%25、%27、%3fに置き換える必要があります。
このメソッドによって形成される「データ」スキームURLは、デフォルトのUS-ASCII文字セットを使用します。別の文字セットを設定する必要がある場合は、URLのメディアタイプ部分で文字セットパラメータを明示的に指定する「データ」スキームURLを作成し、代わりにloadUrl(String)を呼び出します。データURLのmediatype部分から取得された文字セットは、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);
String strWebData="html...." //**Your html string**
WebView webDetail=(WebView) findViewById(R.id.webView1);
WebSettings websetting = webDetail.getSettings();
websetting.setDefaultTextEncodingName("utf-8");
webDetail.loadData(strWebData, "text/html; charset=utf-8", null);
私の場合、上記の答えはうまくいきません。メタタグでutf-8を指定する必要があります
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<!-- you content goes here -->
</body>
</html>
safest WebビューでhtmlContentをロードする方法は次のとおりです。
Chrominiumの最新の01/2019バグ(WebView M72(72.0.3626.76)に存在)で再度記述された(Javadocに既に存在する)Base64エンコーディングの公式推奨事項:
https://bugs.chromium.org/p/chromium/issues/detail?id=92908
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!