symfonyでバリデーション失敗した時に文字化け

Pluginを作成中なのですが、バリデーションに失敗した時にfillinをtrueに設定していると、文字化けしてしまいます。でも、sfGuardUserの方はfillinが設定されていても問題なく動いています。何が違うんだろう…

ちょっと調べてみると、どうやらsfFillinFormの中で文字化けが起きています。引数の$htmlはOKなのですが、$dom->saveHTML()の結果は文字化けしています。

  public function fillInHtml($html, $formName, $formId, $values)
  {
    $dom = new DomDocument('1.0', sfConfig::get('sf_charset', 'UTF-8'));
    @$dom->loadHTML($html);

    $dom = $this->fillInDom($dom, $formName, $formId, $values);

    return $dom->saveHTML();
  }

「DomDocument::loadHTML()が、charsetの判別をマトモにしてくれないので、metaタグをチャンと書いておかないとイケナイらしい」といったことが幾つかのサイトに書かれていたので、調べてみましたが、symfonyの吐き出すHTMLは、metaタグでcharsetも入ってるし、DOCTYPE宣言もあります。$dom->actualEncodingも確認してみましたが、しっかりutf-8でした。

あらためて、もう一度出力されたHTMLを眺めてみると、先頭の方にある何文字かは文字化けしていません。
結局、原因はSJISの全角スペースが1文字混じっていたためでした。そこから後はすべて文字化けしていた訳です。タグを超えても、ずっと文字化けが続いていたので、気がつきませんでした。

折角調べたので、DomDocument::loadHTML()について書かれているページもメモしておきます。