楽wiki

楽にページとデータを作成、管理できるwiki

encode_hint、リクエストの文字コードの変換について

メモ。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をつけないのなら、端末判定から文字コードを決定するのが確実でしょう。という感じに修正しました。

タグ:
作成日 2014-07-13 15:01:14
本データを編集する
Last-modified: 2014-07-13 (日) 15:32:24 (3577d)
ソーシャルボタン表示