メモ。pukiwikiはencode_hintというhidden属性な値をform内に埋め込む。これはplugin.php内で結構強引にやっている。formがあったら、replaceでhiddenな値をつっこんでいる。
以下、当wikiの内部エンコードはUTF8であることを前提とする。
GET、POSTな値はinput_filterを通してnull文字は削除される。その後、変換処理が行われるのだが、GETとPOSTで異なる。
POSTの場合、encode_hint、charsetのいずれかがリクエストにあったら、その値を元にリクエストの文字コードを判定、内部エンコード(SOURCE_ENCODING)に変換する。「ぷ」が設定されているのだが、この文字で判定を失敗することはないらしい。
これらの値がない場合はauto(自動判定)で内部エンコードに変換する。$_LANG['encode_hint']['ja']を空にしていたりすると、この処理がされてしまう。携帯(SJIS)から投稿、内部がUTF8だったりすると、文字化けする可能性がある。
GETの場合だが、encode_hintがあればPOSTと同様の変換処理をする。ない場合は何もしない。GETの場合はパラメータが内部エンコードでエスケープされていることを前提にしているからである。この「何もしない」というのが、以下の場合において問題となる。
ガラケー環境の場合、SJISでページを表示する。formのmethodをGETにし、encode_hintをつけない場合、form送信時におもいっきり問題が発生する。変換処理を何もしない為、内部で取得できる文字がSJISになってしまうからだ。
回避方法はencode_hintをつけるか、POSTにしてしまう。formのmethodは必ずPOSTにするという解決方法でいいかと思う。
POSTの値がautoで変換される処理だが、encode_hintをつけないのなら、端末判定から文字コードを決定するのが確実でしょう。という感じに修正しました。