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で見る限りは文字化けしなくなりました。

 

正直、こんなんで良いのかなぁと思わないでもないですが、文字コードでハマると面倒なので、とりあえずこれでよしとしましょう。