テンプレート変数へ中国語を入力できない($modx->db->escapeの問題?)
Posted: 2011年5月26日(木) 17:19
かなり久しぶりの投稿です。よろしくお願いいたします。
どちらのカテゴリがよいか分からなかったのですが、日本語版特有の問題のような気がしたのでこちらに投稿します。
現在、CentOS4(php 4.3.9, mysql 4.1.22), UTF-8 の環境で 1.0.5J のサイトを運用しています。日本語の入力については全く問題がないのですが、テンプレート変数により用意したフォーム内に簡体字中国語を入力した場合、簡体字の部分だけ抜け落ちてしまう現象にぶつかりました。
例えば「日本东京都」と入力した場合、"東"にあたる"东"だけが抜け落ちます。IEだと文字が消えたように見えますが、FireFoxですと◆形に?の文字化けのように見えます。
違う環境で試してみたところ、
CentOS5(php 5.1.6, mysql 5.0.77), 1.0.5J-r1 入力不可
CentOS5(php 5.1.6, mysql 5.0.77), 1.0.4J-r4 入力可
CentOS4(php 4.3.9, mysql 4.1.22, 問題の1.0.5Jと同じサーバです), 0.9.6 入力可
という結果でした。
.htaccess内のmbstring関連の設定は一致させありますが変わらずです。直感的には 1.0.5J以降で問題が出始めたのではと考えています。
まだコードを追っている最中なのですが、 例えば、/manager/processors/save_content.processor.php 内の 498行以下のコードに次のような箇所があり、
テンプレート変数の値を $modx->db->escape でエスケープしている箇所があります。このエスケープ処理の前後でテンプレート変数の内容が変化しているようで、先の例ならば「日本东京都」の"东"が落ちて「日本\\0京都」となっていました。
この $modx->db->escape 処理のどこかに問題があるのだと思いますが、1.0.5J-r3で既に改善されているということはあるでしょうか。modx_site_contentに格納されるintrotextなどの通常項目も同じエスケープ処理がされるはずですが、こちらは問題がなく、どうも理由が掴みきれない原因にもなっています。
1.0.5jのリリースノートにescape処理の変更が記載されていたので、こちらでも1.0.4j-r4と1.0.5jの該当部分を比較してみようかと思います。
何か情報があればお助け頂ければ幸いです。よろしくお願いいたします。
どちらのカテゴリがよいか分からなかったのですが、日本語版特有の問題のような気がしたのでこちらに投稿します。
現在、CentOS4(php 4.3.9, mysql 4.1.22), UTF-8 の環境で 1.0.5J のサイトを運用しています。日本語の入力については全く問題がないのですが、テンプレート変数により用意したフォーム内に簡体字中国語を入力した場合、簡体字の部分だけ抜け落ちてしまう現象にぶつかりました。
例えば「日本东京都」と入力した場合、"東"にあたる"东"だけが抜け落ちます。IEだと文字が消えたように見えますが、FireFoxですと◆形に?の文字化けのように見えます。
違う環境で試してみたところ、
CentOS5(php 5.1.6, mysql 5.0.77), 1.0.5J-r1 入力不可
CentOS5(php 5.1.6, mysql 5.0.77), 1.0.4J-r4 入力可
CentOS4(php 4.3.9, mysql 4.1.22, 問題の1.0.5Jと同じサーバです), 0.9.6 入力可
という結果でした。
.htaccess内のmbstring関連の設定は一致させありますが変わらずです。直感的には 1.0.5J以降で問題が出始めたのではと考えています。
まだコードを追っている最中なのですが、 例えば、/manager/processors/save_content.processor.php 内の 498行以下のコードに次のような箇所があり、
コード: 全て選択
if (isset($tvIds[$tvId])) {
$tvChanges[] = array(array('tmplvarid' => $tvId, 'contentid' => $id, 'value' => $modx->db->escape($tvVal)), array('id' => $tvIds[$tvId]));
} else {
$tvAdded[] = array('tmplvarid' => $tvId, 'contentid' => $id, 'value' => $modx->db->escape($tvVal));
}
この $modx->db->escape 処理のどこかに問題があるのだと思いますが、1.0.5J-r3で既に改善されているということはあるでしょうか。modx_site_contentに格納されるintrotextなどの通常項目も同じエスケープ処理がされるはずですが、こちらは問題がなく、どうも理由が掴みきれない原因にもなっています。
1.0.5jのリリースノートにescape処理の変更が記載されていたので、こちらでも1.0.4j-r4と1.0.5jの該当部分を比較してみようかと思います。
何か情報があればお助け頂ければ幸いです。よろしくお願いいたします。