Android 3.0のWebViewで文字化けする

2,851 views
Skip to first unread message

miyahara

unread,
Apr 28, 2011, 12:07:59 PM4/28/11
to 日本Androidの会
福岡のmiyaharaです。

WebView表示のアプリを作成しています。

Android 3.0以前の端末では、OKですが。
最近のAndroid 3.0のXOOMやOptimasPadでは、WebView表示で文字化けとなり困っています。
エミューレータのAndroid 3.0では、OKです。

WebViewの
 loadData() やloadDataWithBaseURL()での表示は文字化けし
 loadUrl() で表示している分はOKのようです。
Android 3.0のWebViewは互換性がなくなったのでしょうか。

何か参考の情報があれば、ご教授をお願い致します。

koba yasi

unread,
Apr 28, 2011, 10:30:04 PM4/28/11
to android-g...@googlegroups.com
小林ともうします。

開発機にXoomを使ってAndroid3.0対応をしていますが、WebViewで
文字化けするようなことはありませんでした。

WebViewに表示する文字コードはUTF-8で統一しています。

特定の文字で化けるのでしょうか?


2011/4/29 miyahara <miya...@gmail.com>

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。


miyahara

unread,
Apr 29, 2011, 2:19:43 AM4/29/11
to 日本Androidの会
福岡のmiyaharaです。

小林さん、ありがとうございます。

WebViewに表示する文字コードは、私もUTF-8で統一しています。

特定の文字で化けるのではなくて、日本語はすべて文字化けします。
半角英数字は正常に表示しています。

過去に、# や%の半角文字で文字化けの内容が流れていたので、その対策は行っていて
 Xperia, LYNX 3D, Galaxy S, IS03, HT-03AなどではOKです。
同じアプリでAndroid 3.0以前の端末では、問題なく表示できますので、
Android 3.0で違いがあるのではと思ったしだいでした。

小林さんのXoomでは、文字化けはなかったとのことなので、参考になりました。
改めて、よく調べてみることにします。
その他でも、何か参考の良い情報があれば、よろしくお願い致します。

On 4月29日, 午前11:30, koba yasi <yasikob...@gmail.com> wrote:
> 小林ともうします。
>
> 開発機にXoomを使ってAndroid3.0対応をしていますが、WebViewで
> 文字化けするようなことはありませんでした。
>
> WebViewに表示する文字コードはUTF-8で統一しています。
>
> 特定の文字で化けるのでしょうか?
>
> 2011/4/29 miyahara <miya0...@gmail.com>
>
>
>
> > 福岡のmiyaharaです。
>
> > WebView表示のアプリを作成しています。
>
> > Android 3.0以前の端末では、OKですが。
> > 最近のAndroid 3.0のXOOMやOptimasPadでは、WebView表示で文字化けとなり困っています。
> > エミューレータのAndroid 3.0では、OKです。
>
> > WebViewの
> > loadData() やloadDataWithBaseURL()での表示は文字化けし
> > loadUrl() で表示している分はOKのようです。
> > Android 3.0のWebViewは互換性がなくなったのでしょうか。
>
> > 何か参考の情報があれば、ご教授をお願い致します。
>
> > --
> > このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> > このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> > このグループから退会するには、android-group-j...@googlegroups.comにメールを送信してくださ-い。
> > 詳細については、http://groups.google.com/group/android-group-japan?hl=jaからこのグループにアクセスしてください。

nagamatu

unread,
May 2, 2011, 9:26:01 PM5/2/11
to 日本Androidの会
miyaharaさん、

Honeycombの実機でのみ起こるということですので、もしかしたら 2D描画のハード
ウェアアクセラレーションの日本語のフォント描画に問題があったりするんじゃない
かな。

手元に実機が無いため試せませんが、以下に 2D描画のハードウェア利用の有効化や
無効化に関して書かれています。

http://android-developers.blogspot.com/2011/03/android-30-hardware-acceleration.html

2D描画のハードウェア利用を無効にして改善されるか試して頂けますか?

--

miyahara

unread,
May 3, 2011, 12:30:43 PM5/3/11
to 日本Androidの会
福岡のmiyaharaです。

nagamatu さん、ページ紹介をありがとうございます。

ページ内容を参考にして、hardwareAcceleratedを無効に設定して試してみましょう。
結果は後日に報告します。


On 5月3日, 午前10:26, nagamatu <nagam...@gmail.com> wrote:
> miyaharaさん、
>
> Honeycombの実機でのみ起こるということですので、もしかしたら 2D描画のハード
> ウェアアクセラレーションの日本語のフォント描画に問題があったりするんじゃない
> かな。
>
> 手元に実機が無いため試せませんが、以下に 2D描画のハードウェア利用の有効化や
> 無効化に関して書かれています。
>
> http://android-developers.blogspot.com/2011/03/android-30-hardware-ac...

miyahara

unread,
May 5, 2011, 11:19:45 AM5/5/11
to 日本Androidの会
福岡のmiyaharaです。

結果は、試してみましたが、文字化けはそのままでした。

行ったことは、
AndroidManifest.xmlで、アプリで使っているactivitでhardwareAcceleratedの無効を追加した。
hardwareAccelerated はAndroid3.0からの追加されたようです。

<application android:icon="@drawable/icon"
android:label="@string/app_name"
     android:hardwareAccelerated="true">
<activity android:name=".Test0088"
android:label="@string/app_name"
android:configChanges="orientation|keyboardHidden"
android:hardwareAccelerated="false">
</activity>
</application>

大垣憲俊

unread,
May 5, 2011, 12:13:02 PM5/5/11
to android-g...@googlegroups.com
大垣です。

想像で語ってはならないのかもしれませんが、
追加された機能から考えれば、Android 3.0でWebViewの実装がいくらか変ったのだろうと思います。
(WebViewFragmentの追加、WebSettingsにメソッド追加、WebViewにonPause()、onResume()、saveWebArchive()、showFindDialog()を追加)

それと参考までに、Issue 3552、metaタグをつけることで解決していますね。


wv.loadData("<html><meta http-equiv=\"Content-Type\" content=\"text/html; 
charset=utf-16le\"><body>漢字テスト</body></html>", "text/html", "utf-8");

miyahara

unread,
May 6, 2011, 5:55:44 AM5/6/11
to 日本Androidの会
福岡のmiyaharaです。

大垣さん、情報をありがとうございます。

試してみましたので、報告です。
metaタグはutf-8で使っていましたので、ご指摘ページと同じ utf-16le に変更してみましたが
結果は、直りませんでした、文字化けはそのままでした。

String ss ="<html><meta http-equiv=\"Content-Type\" content=\"text/
html; charset=utf-16le\"><body>テスト テスト表示<br>Android3.0 テスト</body></
html>";
wv.loadData(ss, "text/html", "utf-8");

このシンプルな内容で表示させましたが、 漢字だけが文字化けします。
同じ内容もGalaxy S 2.2では、漢字も正常に表示しています。


On 5月6日, 午前1:13, 大垣憲俊 <noritoshi.og...@gmail.com> wrote:
> 大垣です。
>
> 想像で語ってはならないのかもしれませんが、
> 追加された機能から考えれば、Android 3.0でWebViewの実装がいくらか変ったのだろうと思います。
> (WebViewFragmentの追加、WebSettingsにメソッド追加、WebViewにonPause()、onResume()、saveWeb-Archive()、showFindDialog()を追加)

大垣憲俊

unread,
May 6, 2011, 7:30:18 AM5/6/11
to android-g...@googlegroups.com
大垣です。

Android3.0 の実機がないのでエミュレータで試したところ

public class MyActivity extends Activity { 
    @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);
        WebView wv = (WebView) findViewById(R.id.webview); 
         String ss = // "<html><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">"
            "<html><body>テスト android3.0</body></html>"; 

         wv.loadData(ss, "text/html", "utf-8");
      // wv.loadDataWithBaseURL(null, ss, "text/html", "utf-8", null); 
     }
}

loadDataでは文字化けしますが、コメントアウトしているloadDataWithBaseURLでは正常表示しました。
eclipseでは通常ファイルがsjisで保存されているので、utf-8に変更しています。
(Package Explorerでファイルを右クリックし、Propertiesを選んで、Resource の Text file encoding)


大垣憲俊

unread,
May 6, 2011, 9:23:01 AM5/6/11
to android-g...@googlegroups.com
WebSettingを使うと文字化けは解消しました。

public class MyActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

WebView wv = (WebView) findViewById(R.id.webview);
WebSettings ws = wv.getSettings();
ws.setDefaultTextEncodingName("utf-8");
String ss = //"<html><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">"
"<html><body>テスト android3.0</body></html>";
wv.loadData(ss, "text/html", "utf-8");
// wv.loadDataWithBaseURL(null, ss, "text/html", "utf-8", null);
}
}


以上で分かったことをまとめると、Android3.0エミュレータ(android-sdk_r10-mac_x86) において、
(1) metaタグを使えば、WebSettingsなしでも文字化けしない
(2) metaタグを使わず、WebSettingsなしでは、loadDataで文字化けする
(3) metaタグを使わず、WebSettingsなしでも、loadDataWithBaseURLは文字化けしない
(4) metaタグを使わず、WebSettings.setDefaultTextEncodingName() を指定すれば文字化けしない



miyahara

unread,
May 7, 2011, 1:20:04 AM5/7/11
to 日本Androidの会
福岡のmiyaharaです。

調べてもらった中で
WebSettings.setDefaultTextEncodingName() は試してなかったので、
試してみましたが、やはり実機では文字化けします。

はじめに書きましたが
Android 3.0以前の端末では、OK。
Android 3.0のエミューレータではOKですが、実機では文字化けします。

WebViewの
 loadData() やloadDataWithBaseURL()での表示は文字化けし
 loadUrl() で表示している分はOKです。

気長に調べることになりそうです。

大垣憲俊

unread,
May 7, 2011, 2:07:04 AM5/7/11
to 日本Androidの会
miyaharaさん

> WebSettings.setDefaultTextEncodingName() は試してなかったので、
> 試してみましたが、やはり実機では文字化けします。

では、WebSettings.getDefaultTextEncodingName() の返す文字列を教えて頂いても良いでしょうか?
デフォルトの"Latin-1"が返ってくるようなら、設定できていないことになるし、
"utf-8"が返ってくるようなら、別の問題ってことになりますね。

私から言うのは差し出がましいですが、バグ報告をされたほうが良いでしょうか?

http://code.google.com/p/android/issues/list?can=1&q=webview&colspec=ID+Type+Status+Owner+Summary+Stars&cells=tiles

大垣憲俊

unread,
May 7, 2011, 7:06:31 AM5/7/11
to android-g...@googlegroups.com
大垣です。
あまり参考にはなりませんが、以下、参考までに。


>WebViewの
> loadData() やloadDataWithBaseURL()での表示は文字化けし
> loadUrl() で表示している分はOKのようです。

これら3つのメソッドの違いについて、
android3.0のソースコードは入手できないので、手元にあったandroid2.2_r1.3のソースから抜粋。


    public void loadUrl(String url, Map<String, String> extraHeaders) {

        switchOutDrawHistory();

        WebViewCore.GetUrlData arg = new WebViewCore.GetUrlData();

        arg.mUrl = url;

        arg.mExtraHeaders = extraHeaders;

        mWebViewCore.sendMessage(EventHub.LOAD_URL, arg);

        clearTextEntry(false);

    }


    public void loadUrl(String url) {

        if (url == null) {

            return;

        }

        loadUrl(url, null);

    }


    public void loadData(String data, String mimeType, String encoding) {

        loadUrl("data:" + mimeType + ";" + encoding + "," + data);

    }


    public void loadDataWithBaseURL(String baseUrl, String data,

            String mimeType, String encoding, String historyUrl) {


        if (baseUrl != null && baseUrl.toLowerCase().startsWith("data:")) {

            loadData(data, mimeType, encoding);

            return;

        }

        switchOutDrawHistory();

        WebViewCore.BaseUrlData arg = new WebViewCore.BaseUrlData();

        arg.mBaseUrl = baseUrl;

        arg.mData = data;

        arg.mMimeType = mimeType;

        arg.mEncoding = encoding;

        arg.mHistoryUrl = historyUrl;

        mWebViewCore.sendMessage(EventHub.LOAD_DATA, arg);

        clearTextEntry(false);

    }



loadData() は、loadUrl()を呼んでいて、
loadUrl()では、EventHub.LOAD_URL といういわば命令を付けてWebViewCoreに対してメッセージを送信。
loadDataWithBaseURL()では、EventHub.LOAD_DATA という命令を付けてWebViewCoreに対してメッセージを送信。
このLOAD_URLとLOAD_DATAの違いですが、WebViewCoreのソースコードを見ると、

  case LOAD_URL: {

      GetUrlData param = (GetUrlData) msg.obj;

      loadUrl(param.mUrl, param.mExtraHeaders);

      break;

  }


  case LOAD_DATA:

      BaseUrlData loadParams = (BaseUrlData) msg.obj;

      String baseUrl = loadParams.mBaseUrl;

      if (baseUrl != null) {

          int i = baseUrl.indexOf(':');

          if (i > 0) {

              String scheme = baseUrl.substring(0, i);

              if (!scheme.startsWith("http") &&

                  !scheme.startsWith("ftp") &&

                  !scheme.startsWith("about") &&

                  !scheme.startsWith("javascript")) {

                  nativeRegisterURLSchemeAsLocal(scheme);

              }

          }

      }

      mBrowserFrame.loadData(baseUrl,

              loadParams.mData,

              loadParams.mMimeType,

              loadParams.mEncoding,

              loadParams.mHistoryUrl);

      break;


LOAD_URL での loadUrl(param.mUrl, param.mExtraHeaders); の内部では、
mBrowserFrame.loadUrl(url, extraHeaders); を呼び出しています。
結局、mBrowserFrameのloadData()か、loadUrl()かの違いということです。
ここで、最初に戻って、

> loadData() やloadDataWithBaseURL()での表示は文字化けし 
> loadUrl() で表示している分はOKのようです。 

loadData() は loadUrl() を呼び出しているのに文字化けする、ということに
この部分が変更されていないと仮定するなら、矛盾するわけで。

それで1つ思い出したことが、よくあることとして、
キャッシュに文字化けしたデータが残っているなんてことが
あるかもしれませんね。(そんな初歩的な)

以上、すみません、電力不足のおりに無駄なトラフィックだったかも。


miyahara

unread,
May 8, 2011, 4:10:08 AM5/8/11
to 日本Androidの会
福岡のmiyaharaです。

  大垣さん、参考資料などをありがとうございます。

WebSettings.setDefaultTextEncodingName("utf-8")を行った後の
WebSettings.getDefaultTextEncodingName() の返す文字列は
2.2実機では"utf-8"が返ってきます。
Android 3.0実機では、手持ちがないのでお店の実機などで動作確認している状態なので未確認です。


>loadData() は loadUrl() を呼び出しているのに文字化けする、ということに
>この部分が変更されていないと仮定するなら、矛盾するわけで。

今回のloadUrl()では、一般的なURLアドレスをパラメータとして与えて使っていますので、
ご指摘の場合とは異なります。
その場合の表示ではOKのようです。
Android 3.0のソースが公開されたら、難しいと思われますが
このあたりも追いかけて見ようかと思っています。


それから、
はじめに返信してもらった、小林さん

>開発機にXoomを使ってAndroid3.0対応をしていますが、WebViewで
>文字化けするようなことはありませんでした。

この件は、実機で、WebViewの loadData() やloadDataWithBaseURL()を使った表示で
文字化けするようなことはなかったのでしょうか。
確認できるようでしたら、よろしくお願いします。

大垣憲俊

unread,
May 8, 2011, 5:38:40 AM5/8/11
to android-g...@googlegroups.com
miyaharaさん

大垣です。 もはや、かみつく気力はないのですが、言われていることが、よく分からないのです。
でも、深追いするのはやめておきます。

>今回のloadUrl()では、一般的なURLアドレスをパラメータとして与えて使っていますので、 
>ご指摘の場合とは異なります。 


お手数をおかけしてしまい、お答え頂きありがとうございます。
参考になりました。


koba yasi

unread,
May 10, 2011, 5:24:09 AM5/10/11
to android-g...@googlegroups.com
miyaharaさん

こんにちは、小林です。

Android2.X対応版をAndroid3.0対応に改修していますが、3.0のみ
文字化けするようなことはまだ経験してません。

WebViewに読み込ませるHTML(WEBアプリ)には必ず下記のヘッダを付けています。

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

あとapkファイルに保持しているエラーページは、loadDataWithBaseURL()で読み込ませて
いますが、同じヘッダーを埋め込んでいます。


2011/5/8 miyahara <miya...@gmail.com>
--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。

miyahara

unread,
May 10, 2011, 1:48:55 PM5/10/11
to 日本Androidの会
miyaharaです。

小林さん、ありがとうございます。

私も、以下の同じタグをHTML書式データのヘッダ部に入れていますが、文字化けとなるので、
その他で何かが違っているのでしょう。
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

HTML表示部だけの小さなアプリにして、切り分けて調べてみることにします。
ありがとうございました。


On 5月10日, 午後6:24, koba yasi <yasikob...@gmail.com> wrote:
> miyaharaさん
>
> こんにちは、小林です。
>
> Android2.X対応版をAndroid3.0対応に改修していますが、3.0のみ
> 文字化けするようなことはまだ経験してません。
>
> WebViewに読み込ませるHTML(WEBアプリ)には必ず下記のヘッダを付けています。
>
> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
>
> あとapkファイルに保持しているエラーページは、loadDataWithBaseURL()で読み込ませて
> いますが、同じヘッダーを埋め込んでいます。
>
> 2011/5/8 miyahara <miya0...@gmail.com>
> > このグループから退会するには、android-group-j...@googlegroups.comにメールを送信してくださ-い。
> > 詳細については、http://groups.google.com/group/android-group-japan?hl=jaからこのグループにアクセスしてください。
Reply all
Reply to author
Forward
0 new messages