OS のデフォルトの文字コードが変更になったことで Movable Type の管理画面が文字化けするようになってしまった。システムの文字コードと MySQL のデータベースの文字コードを変更することで対応する。
■ ■ ■
OS を更新したところ (nlog(n): サーバの OS を Vine Linux 4.2 から 6.2 へ更新),OS のデフォルトの文字コードが EUC-JP から UTF-8 に変更になった。Movable Type のコンテンツを EUC-JP で作っていて,MySQL データベースの /var にあったデータをそのまま新 OS にコピーしたところ,Movable Type の管理画面が文字化けするようになってしまった。
動作環境と現象についてまとめると,次のようになる。
- システムのデフォルトの文字コードが EUC-JP から UTF-8 になった
- Movable Type の MySQL のデータは EUC-JP で,管理画面が文字化け
- Movable Type のレンダリングした HTML は EUC-JP で,ブラウザで表示すると文字化けしたりしなかったり
対応する方針としては次とした。
- システムの文字コードを EUC-JP にする
- MySQL の設定でデフォルトを EUC-JP とする
- Movable Type の MySQL のデータを明示的に EUC-JP だと指定する
- Apache は .htaccess でレスポンスヘッダの文字コードを EUC-JP で出力するように指定する
この条件をドンピシャでまとめてくれているサイト (mysqlの文字コードをEUC-JPにする - 揮発性のメモ) を全面的に参考にした。ありがたや〜。
システム全体を EUC-JP に統一する
まずシステム全体を EUC-JP に統一することにした。
# cat /etc/sysconfig/i18n
LANG="ja_JP.eucJP"
SUPPORTED="ja_JP.eucJP:ja_JP:ja"
しかし,これには若干問題がある。man は EUC-JP で表示されるようになるが,アプリケーションによっては UTF-8 でハードコーディングされているため,ターミナル (よく使うのは TeraTerm) の出力文字コードをその度に切り替えなければならないことがあるのだ。
MySQL のデフォルトの文字コードを EUC-JP だと宣言する
MySQL のデフォルトの文字コードを /etc/my.cnf で設定する。
# cat /etc/my.cnf
[mysqld]
skip-character-set-client-handshake
character-set-server = ujis
collation-server = ujis_japanese_ci
log_error="/var/log/mysql/error.log"
log_warnings=1
MySQL を再起動。
# /etc/init.d/mysql restart
MySQL のデータベースの文字コードを EUC-JP に変更する
Movable Type の管理画面が文字化けした状態で,MySQL の状態を調査する。
mysql> show variables like "char%";
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
文字コードの値が utf8 になっている。EUC-JP に変更するには ujis を指定する。
mysql> ALTER DATABASE nlogn_db CHARACTER SET ujis;
変更できているか確認する。
mysql> show variables like "char%";
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | ujis |
| character_set_connection | ujis |
| character_set_database | ujis |
| character_set_filesystem | binary |
| character_set_results | ujis |
| character_set_server | ujis |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
文字コードを変更する際に,データベース名 nlogn_db を指定しているのに,確認するときにはデータベース名を指定していないのが何故なのか分からないが,システムには EUC-JP のデータベースしかないので追求しないことにする (笑)。character_set_system が utf8 なのは無視してよいそうだ。
.htaccess による文字コード設定
サーバのデフォルトの文字コードが UTF-8 になったタイミングで,EUC-JP で送出している HTML ドキュメントが文字化けするようになってしまった。同じブログ内なのに文字化けするページとしないページがあるというのが意味ワカメだが,HTTP のレスポンスヘッダを見ると UTF-8 になっていたので .htaccess で文字コードを指定することにした。
AddType "text/html; charset=EUC-JP" html
これでひとまずは OK なはず。
Posted by n at 2014-11-05 04:23 | Edit | Comments (0) | Trackback(0)