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で文字コードを適切に指定しておけば、あまり問題が起こることはないのですが、今回のように問題になることもあります。

symfony 1.1 のsfFormの情報

symfony 1.1のRC1がでて、間もなくリリースされるという状況ではありますが、ドキュメントについては非常に少ない状態です。

1.1の大きな目玉の一つであるフォームフレームワークについては、なかなか情報が見つかりませんでした。symfonyのサイトにあるドキュメントもまだ1.0の情報のままで、1.1では特別な指定をしない限り使用できなくなりますのと注意書きがあります。

理解すると、前のにくらべてとても使いやすく自由度が高いので非常に便利です。

情報をあさっていくうちに、参考になるサイトを見つけたので紹介します。どちらも英語ですが、コードを見るだけでも参考になると思います。

  • 7 Days of Symfony 1.1 – Forms, Widgets and Validators
    このリンクはDay1ですが、7までありとても詳しく解説されていて参考になります。
  • symfony 1.1 form framework and the MVC pattern
    symfonyの作者であるfabien自身が自分のブログで書いた記事です。チュートリアルではなく、このフォームフレームワークがMVCモデルであることを説明しているページですが、簡潔にコードでも説明していて参考になります。