Shift_JISでエンコードされたウェブページをUTF-8に変換して開くbookmarklet
はじめに
それ何が嬉しいの?なんでそんな無駄なことをするんだ?と言われそうなネタですが、FirefoxでMozilla Archive Format(MAFF)アドオンでShift_JISなページを保存するとiframe内の文字が化けるので作ってみました。本当にニッチですね。MAFFアドオンを直せればいいんですが、それはまたの機会に。
同然ですが、Firefox専用です。
どうやって文字コードを変換するか
はじめは、上記のページで紹介されているようなライブラリを使って変換してdocument.write()しようかと考えていましたが、XMLHttpRequestだけでなんとかなったので使わずに済みました。具体的にはXMLHttpRequestのoverrideMimeTypeメソッドを使って文字コードを指定するとUTF-8に変換できました。正しく変換できたかはalert()で確認しました。
変換できたがdocument.write()すると文字化けけする
ところが変換した文字をdocument.write()しようとすると何故か文字化けします。どうも、ページのエンコードがShift_JISのままだからのようですが、Firefoxのdocument.characterSetはリードオンリーで変更できません。どうにもならないので新しくウィンドウ(タブ)を開き、そこに書き出しました。
完成したBookmarklet
以下のようになりました。
javascript:(function(){D=document;W=window.open("","").document;X=new XMLHttpRequest();X.overrideMimeType("text/html;charset="+D.characterSet);X.onreadystatechange=function(){if(X.readyState==4&&(X.status==200||X.status==304)){W.write(X.responseText);W.close()};};X.open('GET',location,false);X.send();X.abort();})();
最初にdocument;D.write()を使ってスクリプト自体を書き出しているのはオマジナイです。これをしないと何故かoverrideMimeTypeを設定しても正しく変換できませんでした。
オマジナイは 不要でした。