web-dev-qa-db-ja.com

アンドロイド。 WebViewとloadData

Webビューのコンテンツの設定に次のメソッドを使用することができますloadData(String data、String mimeType、String encoding)

Htmlデータの不明なエンコードの問題をどのように処理しますか?!

エンコーディングのリストはありますか?!

私の大学では、htmlがDBから来て、latin-1でエンコードされていることを知っています。エンコーディングパラメータをlatin-1、ISO-8859-1/iso-8859-1に設定しようとしましたが、ä、ö、üなどの特別な記号の表示に問題があります。

アドバイスをいただければ幸いです。

100
Tima
myWebView.loadData(myHtmlString, "text/html; charset=UTF-8", null);

これは、特に文字エンコードを無視するAndroid 4.0で問題なく動作しますinside HTML。

2.3および4.0.3でテスト済み。

実際、「base64」以外の値が最後のパラメーターにどのような値をとるかはわかりません。一部のGoogleの例では、nullが挿入されています。

205
patryk

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

何らかの理由で、これらの関数の実装はまったく異なります。

130
Andrey Novikov

私が理解しているように、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");
35
Ralf

私にはこの問題がありますが、:

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

できます。

18
Aloyan Dmitry

これを使用してください:String customHtml = text;

           wb.loadDataWithBaseURL(null,customHtml,"text/html", "UTF-8", null);
5
krishna
 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);
4
Yiğit

私の場合、上記の答えはうまくいきません。メタタグでutf-8を指定する必要があります

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    </head>
    <body>
        <!-- you content goes here -->
    </body>
</html>
1
Truong Nguyen

safest WebビューでhtmlContentをロードする方法は次のとおりです。

  1. base64エンコーディングを使用(公式の推奨事項)
  2. htmlコンテンツタイプにUFT-8を指定します。つまり、「text/html」ではなく「text/html; charset = utf-8」(個人的なアドバイス)

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! 
1
Pascal