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()について書かれているページもメモしておきます。