MODxの環境設定で、特に文字化けに関係しそうな設定内容を確認するモジュールを作ってみました。
(基本的に管理画面内での設定情報の表示となります。)
←画面例(赤丸は合成)
具体的には、以下の3点について、設定内容を表示します。
■1.system_settings
テーブル「(modx_)system_settings」から読み込まれるもの。
・$modx_charset
主に、画面表示の文字エンコーディングに使われていると思われます。
■2.config.inc.php
「manager/includes/config.inc.php」により設定されるもの。
・$dbase
データベース名(バッククォート「`」で囲まれているかどうかの確認用)
・$database_connection_charset
データベースの接続に使われる文字セット
「SET CHARACTER SET」、もしくは、「SET NAMES」(MODxバージョン0.9.6.2~の場合)に使用されます。
(下記「3.MySQL VARIABLES LIKE character_set...」の元になる設定です)
・$database_connection_method(MODxバージョン0.9.6.2以上の場合のみ)
データベースの接続時に、文字セット設定に使用するコマンド。
「SET CHARACTER SET」、もしくは、「SET NAMES」のどちらか。
■3.MySQL VARIABLES LIKE character_set...
実際にMySQLデータベースとの接続で設定されている情報
以下の2つの状態で、それぞれどのように設定されているかを確認します。
○Manager default
管理画面で「manager/index.php」が最初に接続した状態
○DBAPI connected
「manager/includes/extenders/dbapi.mysql.class.inc.php」の
「DBAPIクラス」による接続が行なわれた後の状態
MODx管理画面から入力された文字のエンコードは、「character_set_client」でエンコードされていると認識され、
「character_set_connection」に変換されてからデータベースに記録されるようです。
逆に、
データベースからMODx側に送られる文字は、「character_set_results」に変換されてから送られてくるようです。
ちなみに、
MySQLサーバ側の、デフォルトの文字セットの設定は「character_set_server」に、
MODxに使用しているデータベースの文字セットの設定は「character_set_database」に、
(正常にデータベースに接続されていれば)それぞれ反映されるはずで、
「SET CHARACTER SET」が使われた場合、「$database_connection_charset」の内容にかかわらず、
「character_set_connection」は、「character_set_database」と同じ値に設定されます。
参考) MySQL 5.1 リファレンスマニュアル/9.4. 接続のキャラクタセットおよび照合順序
http://dev.mysql.com/doc/refman/5.1/ja/charset-connection.html
参考例(上記画面例のケース)
私が実際に体験した文字化けのケースでは、以下のような環境において、
ドキュメント新規作成やチャンクの作成・編集で、全角チルダ「~」や機種依存文字等が文字化けしていました。
設定情報をよくみると、データベースをutf8で作ったにもかかわらず、
「Manager default」では、「character_set_connection」と「character_set_database」がujis(EUC)になっていました。(上記画面例参照)
----
MODx 0.9.6.1p2
PHP 5.1.6
MySQL 5.0.22(サーバ側デフォルト文字セット:EUC)
MODxに使っているデータベースはutf8
$database_connection_charsetもutf8
----
色々調べた結果、このケースでは、接続の際のデータベース名の処理に不具合があることが原因だとわかりました。
(バージョンアップにより、この不具合は解消されるかもしれません)
以下のような「manager/includes/config.inc.php」10行目のデータベース名の2つのバッククォート「`」を削ることで回避できます。
ただし、データベース名にハイフン「-」やMySQL予約語(create等)を使っていないことが条件になります。
インストール方法
いったん、このページの添付ファイルをパソコンに保存するなどしておいて、
MODx管理画面のモジュール>モジュール管理で「モジュールの作成」を開き、
保存しておいたファイルをテキストエディタで開き、全て選択してコピー、
管理画面の「モジュールコード」に貼り付けます。
モジュール名に「check_charset」を入力、
その他、説明等を適宜入力して、保存してください。
管理画面を再読み込みするなどして、モジュール>check_charsetで、設定情報が表示されるはずです。
※作りかけのモジュールをそのまま改造して作ったので、ソースはかなり荒いと思います。ご容赦下さい。
追記)
0.9.6.2の場合、$database_connection_methodも出すようになっているはずなのでこれを追記。
キャプチャ画像とMySQLリファレンスへのリンクを貼りました。(問題あれば削除します)
character_set_server、character_set_database等について説明を加え、事例の説明も変更しました。(2008-09-04 23時30分頃)