アンドロイド。WebViewとloadData


104

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

htmlデータの不明なエンコーディングの問題に対処するには?!

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

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

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

回答:


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

これは、特にAndroid 4.0で問題なく機能します。これは明らかに文字エンコーディングを無視します。 HTML内のます。

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

実際、「base64」以外のどの値が最後のパラメーターをとるのか私にはわかりません。いくつかのGoogleの例では、そこにnullを入れています。


2
US-ASCII文字セット以外の文字がある場合、これは「完全に」機能しません。
Andrey Novikov 2013年

1
4.2.2デバイスで試してみたところ、魅力のように機能しましたが、2.3.6デバイスでは同じ文字化けが表示されるだけです。:S
フランク

これは、4.1.2(HTML内の文字セットも無視する)でも、Latin1エンコーディングでも機能します。図を行きます。
Luis A. Florit 2013年

2
@Frank Same here、HTC one 2.3.7(おそらくすべてのジンジャーブレッド)でテストされ、同じゴミを取得しましたWebView.loadDataWithBaseURL()
。AndreyNovikov

あなたの答えとの違いは何ですか:myWebView.loadData(myHtmlString、 "text / html"、 "UTF-8");
ルーモーダ、2015年

135

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

何らかの理由で、これらの関数の実装は完全に異なります。


1
プリベット、アンドレイ。私はあなたの解決策を試しました。残念ながら私にはうまくいきませんでした:(
Tima

私が説明したようにあなたはUTF-8を試しましたか?さて、あなたの質問について考えると、Javaではすべての文字列がUTF-8であるため、私の例はそのまま動作するはずです。
Andrey Novikov 2010

すべての文字列はUTF-8ですが、サーバーからのテキストはlatin-1です。私は、UTF-8、latin-1、ISO-8859-1を試してみましたが、ü、ö、äではなく、まだ奇妙な兆候が見られました。しかし、別のアイデアがあります。サーバーからのバイトストリームを正しいエンコーディングを使用して文字列に変換しようとします。多分、それは私を助けるでしょう
Tima

4
4.0+では、エンコーディングもMIMEタイプで設定する必要があります "text / html; chartset = utf-8"、そうしないと認識されません
marwinXXII

2
D:最後のスニペット(loadDataWithBaseURLとの1)は、両方の4.2.2と2.3.6のデバイス上で素晴らしい作品
フランク

36

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

これは私がどこにでもさまよう前にドキュメントをチェックすることを思い出させました!
Pradeep、

答えてくれてありがとう!WebViewにさまざまな組み込みのコンテキストHTMLヘルプをロードしていましたが、一部の時間しか機能しませんでした。これで修正されました。
eric

20

私はこの問題を抱えていますが、

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

できます。


これはGoogleが推奨するものではありません。ビデオ通話;-)私の答えとDOのチェックを参照してくださいstackoverflow.com/questions/3961589/...
パスカル

6

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

           wb.loadDataWithBaseURL(null,customHtml,"text/html", "UTF-8", null);

15ポスト後、これは私のために働いた唯一のものです
Guy Cothal

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

5

最も安全な WebビューでhtmlContentをロードする方法は、以下のとおりです。

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

「Base64エンコーディング」は公式の推奨事項であり、Chrominiumの最新の01/2019バグ(WebView M72(72.0.3626.76)に存在)で再度記述されています(Javadocにすでに存在):

https://bugs.chromium.org/p/chromium/issues/detail?id=929083

Chromiumチームの公式声明:

「推奨される修正:
Base64でデータをエンコードすることをお勧めします。その方法の例を以下に示します。

  • APIドキュメント:https ://developer.android.com/reference/android/webkit/WebView.html#loadData(java.lang.String,%20java.lang.String,% 20java.lang.String)
  • ビデオトーク:https : //youtu.be/HGZYtDZhOEQ?t=598(タイムスタンプ9:58にジャンプ)

この修正は下位互換性があり(以前の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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.