2005年12月10日
川俣晶の縁側ソフトウェア技術雑記total 8306 count

まさか解決策不在なのか? OperaのXMLHttpRequestオブジェクトのresponseTextが文字化けする問題の更なる深み

Written By: 川俣 晶連絡先

 OperaのXMLHttpRequestオブジェクトでテキストデータを取得する際、そのテキストデータがUTF-8で記述されている場合にresponseTextが文字化けするという問題が知られています。

 そのため、OperaではBOM付きUTF-16で送ると良いとされています。

 しかし、UTF-8でも文字化けしないケース、UTF-16でも文字化けするケースが存在することが分かりました。

環境 §

Windows XP SP2 + Opera 8.5 日本語版

その1・UTF-8で文字化けが起こらないケース §

 以下のテストデータをBOM無しUTF-8で保存し、OperaのXMLHttpRequestオブジェクトで読みませたところ、文字化けしませんでした。

 responseTextで取得する文字データは、エンコードの自動判定ロジックで自動識別されるようで、シフトJISやEUC-JPで記述しても文字化けしません。

 しかし、全てのケースで文字化けが起こらないわけではなく、自動判定が上手く機能しないデータに対しては、判定を失敗する可能性があります。

 (ただし、下記「その2」の結果から、この結果になるのはエンコードが日本語・自動判別になっているケースだけと推測されます。ユーザーがメニュー操作で別の設定にしている場合は、文字化けする可能性があります)

テストデータ(判定が成功するケース・3行のテキストデータ) §

「今日の味噌汁の具は何だい?」

「ふ」

「なんと。今日ふの味噌汁(きょうふのみそしる)か!」

テストデータ(判定が失敗するケース・1行だけのテキストデータ) §

あいうえお

注: 1行だと判定が失敗し、3行なら失敗しないという意味ではありません。

その2・UTF-16で文字化けが起こるケース §

 以下の手順を取ると、responseTextに含まれる文字列が文字化けします。

  • UTF-8で記述されたHTMLファイルを作製する
  • その内部にXMLHttpRequestオブジェクトのresponseText経由でテキストデータを取得するコードを含める (ボタンのクリックイベントで実行させるようにしておく)
  • テキストデータはBOM付きUTF-16で記述する
  • OperaでこのHTMLファイルを開く (ローカルHDDから)
  • Operaのメニューから「表示」→「エンコード」→「Unicode」→「UTF-8」と選ぶ (この操作によって表示されているHTMLファイルの文字化けは起こらない)
  • ボタンをクリックし、UTF-16のテキストデータを読み込ませる
  • responseTextに含まれる文字列が文字化けしている

考察 §

 これらのOperaの挙動から推測されることは、以下のことです。

  • OperaのresponseTextで使用されるエンコードはメニューの設定に依存する
  • その際、「日本語自動判定」のような自動判定を含む設定が選択されている場合は、自動判定される
  • 完全な自動判定は不可能であることはアルゴリズム的に明らかであるので、判定に失敗するケースが存在する

 以上から2つの致命的な問題が存在することが推測されます。

  • 正しい文字列を取得できるか否かは、ユーザーが気軽に設定変更可能な「エンコード」の設定に依存する。つまり、ユーザーが何気なく行ったメニュー操作の結果、プログラムの正常な動作が阻害される可能性があり得る
  • 自動判定の不完全性により、テストデータで正常に動作したプログラムが、実データで誤動作する可能性がある

 とりあえず結論としては……、responseTextの利用はリスクが高すぎるので、responseXMLを使うべき……ということなのかな……。

付録・その2の検証プログラム §

sync002utf8.html (BOM無しUTF-8で保存) §

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

<html LANG="ja-JP">

<head>

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

<META http-equiv="Content-Script-Type" content="text/javascript">

<title>テストページ</title>

<script type="text/javascript"><!--

function viewText(name)

{

    httpobj = createHttpRequest();

    httpobj.open( "GET", name, false );

    httpobj.send(null);

    document.getElementById('text').value = httpobj.responseText;

}

function createHttpRequest()

{

    //Win IE用

    if(window.ActiveXObject){

        try {

            //MSXML2以降用

            return new ActiveXObject("Msxml2.XMLHTTP")

        } catch (e) {

            try {

                //旧MSXML用

                return new ActiveXObject("Microsoft.XMLHTTP")

            } catch (e2) {

                return null

            }

        }

    } else if(window.XMLHttpRequest){

        //Win IE以外のXMLHttpRequestオブジェクト実装ブラウザ用

        return new XMLHttpRequest()

    } else {

        return null

    }

}

// --></script>

</head>

<body>

<p>

<input type="button" onclick="viewText('badcase1utf8.txt');" 

    value="UTF-8で読み込む" ></input>

<input type="button" onclick="viewText('badcase1utf16.txt');" 

    value="UTF-16で読み込む" ></input>

</p>

<textarea id="text" rows="6" cols="40" readOnly></textarea>

</body>

</html>

badcase1utf8.txt (BOM無しUTF-8で保存。1行だけのテキストデータ) §

あいうえお

badcase1utf16.txt (BOM付きUTF-16で保存。1行だけのテキストデータ) §

あいうえお

2005年12月10日16時30分頃追記 §

 Firefox 1.5とInternet Explorer 6.0 SP2でも類似のテストを行ってみましたが、「responseTextの文字化け」という意味では、この2つはユーザーのメニュー操作の影響を受けないようです。

2005年12月10日18時30分頃追記 §

 続きの話もどうぞ

Facebook

トラックバック一覧

2005年12月11日【Ajax】Operaの文字化けFrom: JavaScript++かも日記

Ajax-MLで川俣さんのOperaと文字化けについての調査が流れていたので、検証してみました。 川俣さんの調査::まさか解決策不在なのか? OperaのXMLHttpRequestオブジェクトのresponseTextが文字化けする問題の更なる深み http://mag.autumn.org/Content.modf?id=20051210160430 テスト1 リクエストを出す側とレスポンスデータのエンコードが違う場合 http://jsgt.org/ajax/ref/charset_test/responsetext_kawatest/htaddtype_txt-utf8_htm-sjis/kawa_test1.htm .htaccessを、 AddType text/plain;charset=UTF-8 .txt AddType text/html;charset=Shift_JIS .htm 読み込むtest_1_u8.txtを UTF-8 テストページを Shift_JIS 【結果】 「自動選択」OK 「Shift_JIS」文字化け テスト2 つまり、リクエストを出す側とレスポンスデータのエンコードが同じShift_JISの場合 http://jsgt.org/ajax/ref/charset_test/responsetext_kawatest/htaddtype_txt-sjis_htm-sjis/kawa_test1.htm .htaccessを、 AddType text/plain;charset=Shift_JIS .txt AddType text/html;charset=Shift_JIS .htm test_1_sjis.txtをShift_JIS このファイルをShift_JIS 【結果】 「自動選択」OK 「Shift_JIS」OK テスト3 リクエストを出す側とレスポンスデータのエンコードが同じUTF-8の場合 http://jsgt.org/ajax/ref/charset_test/responsetext_kawatest/htaddtype_txt-utf8_htm-utf-8/kawa_test1.htm .htaccessを、 AddType... 続きを読む

このサイト内の関連コンテンツ リスト

2005年
12月
10日
XMLもダメなのか! responseTextだけではなかった、OperaのXMLHttpRequestオブジェクトの文字化け問題
3days 0 count
total 5617 count

このコンテンツを書いた川俣 晶へメッセージを送る

[メッセージ送信フォームを利用する]

メッセージ送信フォームを利用することで、川俣 晶に対してメッセージを送ることができます。

この機能は、100%確実に川俣 晶へメッセージを伝達するものではなく、また、確実に川俣 晶よりの返事を得られるものではないことにご注意ください。

このコンテンツへトラックバックするためのURL

http://mag.autumn.org/tb.aspx/20051210160430
サイトの表紙【技術雑記】の表紙【技術雑記】のコンテンツ全リスト 【技術雑記】の入手全リスト 【技術雑記】のRSS1.0形式の情報このサイトの全キーワードリスト 印刷用ページ

管理者: 川俣 晶連絡先

Powered by MagSite2 Version 0.36 (Alpha-Test) Copyright (c) 2004-2021 Pie Dey.Co.,Ltd.