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


