New Community Forums are coming. Watch this space for news.
Subscribe: RSS
  • 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等)を使っていないことが条件になります。
    $dbase = '`dev_modx`';


    インストール方法

    いったん、このページの添付ファイルをパソコンに保存するなどしておいて、
    MODx管理画面のモジュール>モジュール管理で「モジュールの作成」を開き、
    保存しておいたファイルをテキストエディタで開き、全て選択してコピー、
    管理画面の「モジュールコード」に貼り付けます。
    モジュール名に「check_charset」を入力、
    その他、説明等を適宜入力して、保存してください。
    管理画面を再読み込みするなどして、モジュール>check_charsetで、設定情報が表示されるはずです。
    ※作りかけのモジュールをそのまま改造して作ったので、ソースはかなり荒いと思います。ご容赦下さい。
    追記)
    0.9.6.2の場合、$database_connection_methodも出すようになっているはずなのでこれを追記。
    キャプチャ画像とMySQLリファレンスへのリンクを貼りました。(問題あれば削除します)
    character_set_server、character_set_database等について説明を加え、事例の説明も変更しました。(2008-09-04 23時30分頃)
      ★日本公式フォーラム2009年9月1日本格始動!★
      http://modxcms-jp.com/bb/

      ▼ウェブ屋のCMS→modxヒキダス流(備忘録)
      http://d.hatena.ne.jp/hikidas_ikeda/
      ▼制作済みHTMLページをmodxで更新するデモ
      http://www.hikidas.com/hikidas/modx_document/modx_demo_osc2009kansai.php