aachyeeのブログ

備忘録的メモ。主にIT(プログラミング、電子工作)、DIY、アウトドアネタ。詳細はaboutを。

Shift_JISでエンコードされたウェブページをUTF-8に変換して開くbookmarklet

はじめに

それ何が嬉しいの?なんでそんな無駄なことをするんだ?と言われそうなネタですが、FirefoxMozilla Archive Format(MAFF)アドオンでShift_JISなページを保存するとiframe内の文字が化けるので作ってみました。本当にニッチですね。MAFFアドオンを直せればいいんですが、それはまたの機会に。

同然ですが、Firefox専用です。

 

どうやって文字コードを変換するか

javascriptで文字コード変換 - Qiita

はじめは、上記のページで紹介されているようなライブラリを使って変換して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を設定しても正しく変換できませんでした。

オマジナイは 不要でした。