2016年2月27日() うんざりする作業:「きのこ雑記」のエンコーディング統一
 今日の「雑記」は長い上に写真が一つもない。また、きのことは一切関係ないし、ホームページやHTMLの基礎知識が乏しい人には何のことか分からないかもしれない。

 先週アマゾンのFireタブレットを購入した。これまでは旧型のKindleを使っていた。プライム会員だと4,980円で買えることも購入の大きな要因になった。スマホと違って電池の持ちがよく、比較的大きな画面できのこの画像を見られることも動機のひとつだった。

 タブレットを使って初めて気づいたコードミス
 いちおうタブレットゆえ旧型Kindleと違ってネットサーフィンができる。「きのこ雑記」を開いたところ、まともに読めるページと文字化けで読めないページが混じっている。変だなぁ〜と思って、いくつかのページのソースを開いてみて愕然とした。HTMLファイル上でのcharsetの指定がまちまちだった。ヘッダ部(<HEAD>〜</HEAD>)に書かれる以下の部分だ。
 <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
 上記の太字の部分にShift_JIS、EUC、UTF-8の三者が混じっていた。しかも、それを記述したファイルのエンコードもまちまちで、HTML上での指定と現実のコードセットが違うページがいくつもあった。そもそもこの一行が全く記述されていないHTMLファイルすらあった。文字化けが起こって当然で、タブレットによっては「きのこ雑記」はまともに読めないことも判明した。

 パソコン上のブラウザは自動判定してくれる
 改行コードも(Windowsの)CR+LF、(旧Macの)CR、(LinuxやOS Xの)LFと三通りが混じって使われていた。パソコン上のブラウザだとエンコーディングや改行はたいてい自動で判定してくれる。よしんば文字化けが起こってもエンコード変更をすれば適切に表示される。
 これまで「きのこ雑記」はパソコン上でしか開いてみたことがなかったので、長いことエンコードのミスや改行コードなどには全く気づいていなかった。おそらくこれらのミスはここ十年ほどのあいだに次々と蓄積されて今のようになってしまったのだろう。

 ソースファイルはつねにエディタで書いてきた
 「きのこ雑記」を開設してはや16年になる。当初からホームページ作成ソフトは使わず、もっぱらエディタのみでHTMLファイルを書いてきた。だからOSが変わろうとホームページの維持や更新作業には一切影響がなかった。いちいちタグを書くのは面倒なので、テキストファイルをHTMLファイルに加工したり、索引を作ったりはもっぱらPerlやらRubyのスクリプトを書いて処理してきた。当初はRubyは生まれていなかったから、古いコードは多くがPerlで書かれている。問題は、それらのHTMLファイルをいろいろなOS上で生成してきたことにある。OSが異なれば自ずと使用するエディタも違ってくる。それぞれにいろいろなクセがある。

 特に指定しなければOS標準のコードセットで保存される
 これまでの16年間メインパソコンではMS-DOS→Windows→Mac(MacOS→OS X)→Linuxと変遷して、Linuxの使用期間が最も長い。LinuxのディストリビューションもSlackwareからはじめて、RedHatなどを経ていまはUbuntuだ。エディタもVZ(MS-DOS)、WZ(Windows)、秀丸(Windows)、Jedit(Mac)、Emacs(Linux)を主に使ってきた。OSによって標準の文字コードセットは全く異なる。それぞれのエディタは特に指定しなければ、OS標準のコードセットで保存される。

 MS-DOS時代にShift_JISコードで開始した
 「きのこ雑記」のHTMLファイルは当初MS-DOS上のエディタVZで書いていた。だからcharsetの指定はShift_JISだった。Windows時代になってからは、新たにファイルを作成するときに途中からUNICODE(UTF-8)を指定するようにした。Macでも同様に新たなファイルではUTF-8を指定した。Linux上で新しいファイルを作成する場合にはEUCを指定した。16年の間には、リンクシステムを変更したり、内容の一部に修正を加えたりした。これがさらにミスマッチを増加させた。

 古いファイルを新たに別のエンコードで保存してしまった
 MS-DOS時代に書いたHTMLファイルにはcharsetの項にShift_JISと記されていた。これを修正したときに同じエンコードで保存すれば問題はなかったのだが、迂闊にもその時使用していたOS標準のエンコードで保存してしまったものがある。だから指定にはShift_JISとなっているにもかかわらず、そのファイル自体はUTF-8で書かれることになったり、指定はUTF-8なのにファイルはEUCで書かれているといったファイルがいくつも生まれてしまった。

 保存するエンコードとcharsetの指定をShift_JISに一本化した
 つまるところ、ファイル内部で指定したcharsetと、そのファイルを保存するcharsetを統一しない限り文字化けは避けられない。いま現在「きのこ雑記」の中で使用されているHTMLファイルは12,000本ほどになることが分かった。とりあえずcharsetをShift_JISで統一することにした。大半のHTMLファイルはスクリプトが生成したものなので、パターン化が可能だ。つまりスクリプトで一括処理ができる。しかし、およそ200点ほどのファイルは手動で修正するしかない。

 Windows上の秀丸エディタとRubyスクリプトで修正実行
 手動での作業にはWindows上の秀丸エディタを使いShift_JISで保存した。パターン化が可能な大部分のファイルの修正にはRubyでスクリプトを書いて実行した。そのパターンを生み出すスクリプトもcharsetをShift_JISに指定して、Shift_JISで保存した。こう書くと簡単に見えるが、これが結構面倒くさかった。手動での修正には2時間ほどかかった。Rubyスクリプトを書くのに30分、デバッグに30分ほど必要だった。次々に該当ディレクトリ(フォルダ)にこのスクリプトを適用した。最終的に全ての作業が終わるまで2時間ほどかかった。

 FTPでサーバーにアップするのに長い時間がかかった
 全てのファイルの修正が終わった後が大変だった。ふだんはごく一部のタイムスタンプが新しい修正済みのファイルや新規ファイルだけをサーバーにアップすればよいからFTPは短時間で完了する。ところがこの日ばかりは、ほとんど全てのHTMLファイルをアップしなくてはならない。一時間ほどじっと待ったろうか。タブレットFireで「きのこ雑記」を開くと文字化けは解決していた。長い長い一日だった。ディスプレイを見つめる時間が長かったので目が疲れた。



日( )
HOME