XOOPSのUTF-8化に関するメモ
この記事は2009/10/30に公開され2012/01/09に更新、1,716回読まれました。
旧サーバ(Vine Linux2.6)でEUC-JPで運用していたXOOPSをCentOSに移行しました。
データベースを強制的にUTF-8で読む設定をすることで無事に運用できていたのですが、MyAlbum-Pにおいて問題が発生していました。
「画像の一括登録」において、日本語ディレクトリを指定できないのです。
原因はハッキリしていました。
サーバの文字コードがUTF-8のため、EUC-JPで運用されているXOOPSから見ると文字化けしてしまうのです。
そこで思い切ってXOOPS全体のUTF-8化を図りました。
条件
- 運用中のサイトを無停止で移行する。
- 個別トピックの書き換えは最小限にする(結果的に無しになりました)。
準備
- 該当バージョンのXOOPSインストールファイルを用意。
- 旧サイトと別のディレクトリにインストールファイルを展開。
例:旧サイト/x/ 新サイト/x2/ - インストールファイルのUTF-8化を行う。具体的には各フォルダのlanguage/japanese/フォルダ内のファイルを全てUTF-8にする。
sshでxoopsディレクトリに移動し、以下のコマンドを実行。
find . -type f -name “*.php” -exec nkf -w –overwrite {} \;
該当ディレクトリ以下のEUC-JPのphpファイル がすべてUTF-8に変換されます。 - /x2/install/language/japanese/install.phpを書き換え。
define(‘_INSTALL_CHARSET’,’EUC-JP’);
↓
define(‘_INSTALL_CHARSET’,’UTF-8′); - /x2/language/japanese/global.phpを書き換え。
define(‘_CHARSET’, ‘EUC-JP’);
↓
define(‘_CHARSET’, ‘UTF-8’); - /x2/class/database/mysqldatabase.phpを書き換え。
$result = mysql_query($sql, $this->conn);の上部に、
mysql_query(”SET CHARACTER SET UTF8″, $this->conn);
$result = mysql_query($sql, $this->conn);の上部に、
mysql_query(”SET CHARACTER SET UTF8″, $this->conn); を追加。 - /x/themes/ディレクトリ以下を/x2/themes/以下にコピー。
インストール
- /x2/install/index.phpにアクセスしてインストール。
- 旧サイトのデータベースをphpMyAdmin等でエクスポートして保存(例:x.sql)。
- 新サイトのデータベースの構造をphpMyAdmin等で全て削除。
- 新サイトのデータベースにx.sqlをインポート。
調整
- 新サイトが正常に動くことを確認したら、/x/を/x-org/にリネーム。
- /x2/を/x/にリネーム。
- /x/mainfile.phpの以下の項目を編集。
// XOOPS Virtual Path (URL)
// Your database user account on the host
// Your database user account on the host
// Password for your database user account
// The name of database on the host. The installer will attempt to create the database if not exist - /x-org/uploads/を/x/に移動。要領が小さければコピーしても良い。
メールヘッダの文字化け対策
- このままでは、新規登録メール等の件名/送信者が文字化けする(本文は大丈夫)。
- class/mail/phpmailer/class.phpmailer.php 129行目
function EncodeHeader ($str, $position = ‘text’, $force=false) {
if( $position == ‘text’ ) return mb_encode_mimeheader( mb_convert_encoding( $str , mb_internal_encoding() , ‘auto’ ) ) ; // 追加
if (!preg_match(‘/^4\.4\.[01]([^0-9]+|$)/’,PHP_VERSION)) {
if (function_exists(‘mb_convert_encoding’)) { //Use mb_string extension if exists.
if ($this->needs_encode || $force) { - 上記の通り一行追加しておく。
コメントする