symfony 1.1 でのsfFormを使用する際の文字化けの解消

symfony 1.1 のフォームを使用すると、明らかな文字化けではないが、文字列の最後に?がつくなどの文字化けをすることがありました。

原因は、サイトの都合上、phpの内部コードと外部コードを別々にしなければならない案件があり、外はSJIS、中はEUCとしていたため、htmlspecialcharsでの文字コード指定時に外側用のSJISとして適用されていたためだったようです。これを調べる過程でどこかのサイトで、理論的にはhtmlspecialcharsで文字コードの指定をしても、日本語については何の意味もないというような記事があったが、実際には変わるようです。少なくとも今回はそれで解消しました。

実際に行ったのは、下記のコードをeucForm.class.phpとして、(このフォームの使用範囲に応じて)symfonyプロジェクトディレクトリ直下のlibか、apps/appname/libか、モジュールのlibかにおいて、フォームを使用する際はsfFormをextendsして使うのではなくeucFormをextendsして使用すれば大丈夫です。他にももしかしたら方法があるのかもしれませんが、時間もなかったのでとりあえずこれで切り抜けました。

< ?php

/**
 * eucForm class
 *
 * 文字コードの指定(EUC-JP)
 *
 */
class eucForm extends sfForm
{
  public function setup()
  {
    //文字コードの指定
    foreach($this->widgetSchema->getFields() as $widget){
      $widget->setCharset('EUC-JP');
    }
    parent::setup();
  }

}

これだけです。このEUC-JPと直接書きこんでいるところを、設定ファイルからsfConfig::get(‘app_internalencoding’)などとやって、app.ymlにinternalencoding: EUC-JP と書くことで汎用性を持たせるのもありかもしれませんが、そもそも内部コードにSJISを持たせることは考えにくいし、UTF-8なら変換の必要はないし、と考えるとこのようなことをやらなければならないのは、内EUC-JP、外SJISに限られるかなと思ってEUC-JP専用にしてしまいました。

symfonyを使用する際はできるだけ外も内もUTF-8を使用するようにしていますが、いろいろな都合でそうもいかないことも時にはあります。 それでもphp.iniや.htaccessで文字コードを適切に指定しておけば、あまり問題が起こることはないのですが、今回のように問題になることもあります。

Share on Facebook
このエントリーをはてなブックマークに追加
はてなブックマーク - symfony 1.1 でのsfFormを使用する際の文字化けの解消
Bookmark this on Yahoo Bookmark
Bookmark this on Livedoor Clip
Share on FriendFeed

2 thoughts on “symfony 1.1 でのsfFormを使用する際の文字化けの解消

  1. Pingback: rpsblog.com » A week of symfony #72 (12->18 may 2008)

  2. ありがとうございます。丁度探していた情報でした。Symfonyでも内部コードをEUCにして特に問題は無さそうですね。私も、DB側の要求で(少なくともDBに関しては)EUCを使わざるを得ない状況で、Symfonyすべての内部コードをEUCにすべきか、クライアント側で変換させるべきかを検討していました。Symfonyで特に問題が無いようなら、内部コード全体をEUCにしたほうがよさそうですね。

    ところで、sfFormのsetupメソッドは(少なくとも私の手元にある1.1.1のソースでは)configureメソッドの前に走るようになっています。サンプルソースだと、書き換えが行われないのではないでしょうか?

    どうせ継承して新しいクラスを作ってしまうならコンストラクタそのものを差し替えてしまったほうがいいかもしれないと思うのですが、いかがでしょうか?

    突然のコメントで大変申し訳ありませんが、もしよろしければお返事をお聞かせ頂ければ幸いです。宜しくお願いします

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です