pWebManagerの移行とバージョンアップのテストをして文字コードをUTF8に変更
使っているサイトをほとんど見かけないのですが、pWebManagerというWebページの更新システムがあります。
静的なHTMLのページに更新情報など、一部だけユーザーが変更したい、又はイベント情報のページを作って編集したいといったときに、HTMLにSmartyの構文を書込んでやります。
実際にはこんな風にHTMLを書込みます。
新着情報やイベント情報などは汎用モジュールを使うはずなので、コンテンツを作成し、それに対するテンプレートを登録します。
このテンプレートに対して記事を書いていくと、”登録したテンプレートID.html”に記事が出力されるようになっているので、このHTMLに先ほどのようにSmartyの構文を書込むと記事が表示されます。
そして、該当ページはリダイレクトを設定しておきます。
と、まぁpWebManagerの説明は余り関係なく、これも数年前導入したバージョンだったのでデータを移行してバージョンアップのテストを行いました。
なんとなく気にはなっていたのですが、このシステムはSmartyを使っているので、文字コードはEUCです。
Webサイトのどこを見てもバージョンアップの方法は書いていないので、最新バージョンをダウンロードしてきて、インストールで作成されるテーブルのスクリプトを比較してみました。
すると、2つのテーブルでカラムが1つ増えただけで後は全く同じということが判明。
そうしたら
1. DBのエクスポート
2. テストサーバーでpWebManagerの最新バージョンをインストール
3. エクスポートしたテキストのSQLを新バージョン用に修正(2つのテーブルでカラムが増えた為)
4. テストサーバーでDBのインポート
を行いました。
これでサイトを再表示してみると文字化け…なぜだ?
現行のサイトで使っているバージョンではMySQLのテーブルは
ENGINE=MyISAM DEFAULT CHARSET=ujis
テーブルの内容をphpMyAdminで表示してみると文字化けはしていません。
サイトもちゃんと表示されています。
テストサイトにインポートしたMySQLのテーブルも全く同じなのでujisになっていて文字化けしていません。
文字コードでハマりました。
では、最新バージョンをインストールした状態ではどうか見てみました。
やはりというか、InnoDB、utf8でテーブルができています。
インストールの際に動くSQLにはMySQLのENGINEもDEFAULT CHARSETも書かれていなかったので、動いているMySQLの規定値になっています。
コンテンツを作成してみると、日本語はちゃんと表示されています。
MySQLのテーブルの内容をphpMyAdmin見てみると….文字化けシトル (´・ω・`)
おいおい…。
テーブルがutf8で保存されている文字コードがEUCなのか?
じゃぁ、ujisで作ったテーブルにインポートして結果は…
インポートするデータの文字コードの問題ということは分かります。
あ~やって、こ~やってと作業していったのですが、だんだん面倒になってきたので別の手に出ました。
「そもそもEUCじゃなくてutf8で全部通しちゃえば良いじゃん。 いまどきEUCもね~だろ。」
と納得して調べていたら、このサイトを見つけました。
これこれ。
要するにeuc-jpをutf8に書き換えてしまえば良い。
更にphpとhtmlとtplのファイルのエンコードがeucになっているのでutf8に書き換えてしまう。
テンプレートの文字コードを指定してするところがあるので、そこだけは書き換えた後で元に戻しておきます。
やった作業はサイトに書いてあった内容と全く同じ。
さくらのレンタルサーバーだからsshでログインして、pWebManagerのディレクトリまで移動して、
find . -type f \( -name "*\.php" -o -name "*\.html" -o -name "*\.tpl" \) | xargs grep 'euc-jp'
とコマンドを打つと「euc-jp」の文字列を使っているファイルがいくつか出てきますね。
手で直すのは大変なので、サイトに書いてあるとおり(ちょっとコマンド変えてますけど)
find . -type f \( -name "*\.php" -o -name "*\.html" -o -name "*\.tpl" \) | xargs sed -i '' 's/euc-jp/utf-8/g'
find . -type f \( -name "*\.php" -o -name "*\.html" -o -name "*\.tpl" \) | xargs sed -i '' 's/EUC-JP/UTF-8/g'
で置換して、
find . -type f \( -name "*\.php" -o -name "*\.html" -o -name "*\.tpl" \) | xargs nkf -w –overwrite
でファイルのエンコードをutf8に変換しました。
pwm/system/webapp/lib/StandardAction.class.php
に1行
$this->db->execute('SET NAMES utf8', null);
を書き加えて表示してみると文字化けは解消。
新規にコンテンツとテンプレートを作成しましたが、phpMyAdminで見る限りは文字化けしなくなりました。
正直、こんなんで良いのかなぁと思わないでもないですが、文字コードでハマると面倒なので、とりあえずこれでよしとしましょう。