文字コードが違う!SJISのページをUTF-8に変更したらクエリ付URLが死んだ話

sjis_utf_mbnk
ガラケーサイトからスマホやPC向けサイトへとサイトを拡大する場合、
SJISだった文字コードを「この際だからUTF-8に一括で変更してしまおう」と思ったのが悪夢の始まりでした。
formからのデータ送信やGETでのクエリが山のようにインデックスされていたので、
その全ての外部リンクが文字化け状態。
まぁ、htaccessあたりで何とかなるだろうと思っていたのですが・・・

SPONSORED LINK

htaccessで文字コードの判別は無理

どう考えてもhtaccessで文字コードの判別して転送なんて無理っぽい。
見切り発車万歳!でもガラケーも新しい機種はUTF-8対応しているみたいだし、
今後を考えると移行しちゃってもいいや。
一つ一つの/hoge.php?keyword=○○○○を転送設定なんてやってられない。
内部文字コードとかPHPでなんとかならないかな?
アクセスされたページはSJISのurlencodeの文字列を持ったクエリ付URL
ページの文字コードはUTF-8になっている。

フルオートで変換を諦める

よく目にする、ie=UTF-8みたいな判別クエリも付けてないし、
フルオートでの変換・転送は即諦めて、アクセスや被リンクの多いワードだけ拾うことに。
目当てのワードを「天丼」として

mb_convert_encoding("天丼","SJIS-win","UTF-8");

一回SJISに直して一致確認してみたら、
SJISで照合合致したので、UTF-8に転送という遠回りなアナログ手法でやってしまいました。
本当はもっと効率の良い方法があるかもしれないけど、
サイト全体の文字コードを変更してエラーがないのは難しいですよね。
おかげで、DBとの連携も楽になりました。

外部ファイルの文字コードにも注意!

だけど外部呼出しファイルの文字コードがSJISだと

・・・悪夢だ。

そりゃそうなんだけど、その外部呼出しファイルはPHPが入った使いまわしで、
SJISから呼び出す前提で作られているファイルでしたのでSJISです。
とにかく動かないと始まらないので、対処方法として

1.外部ファイルをUTF-8用に用意する。
2.変換方法を探す。

1.は内容的にも管理的にも面倒でゴミが増えると思ったので、却下。
そこで調べるとeval関数なる危なそうな物がありました。

$test = file_get_contents('../hoge.php');
eval('?>'. mb_convert_encoding($test, 'UTF-8', 'SJIS-win'). '<?');

一発で動く奇跡。
後から関数熟読で理解する始末。
なかなか危ない関数なようで、

警告 eval() は非常に危険な言語構造です。
というのも、任意の PHP コードを実行できてしまうからです。
これを使うことはおすすめしません。

となっています。
まるでマジックのような関数ですが、外部ファイルをPHPとして実行するなんてよく考えると恐怖ですね。

まとめ

いずれ排除するとして今回は一度使うことにしましたが、一時的に凌ぐ手段だと思った方がよさそうです。
いやーこのままだとSJISが嫌いになりそうです。
やっぱりSJISは鬼門です。

今日も知識欲は止まらない。

SPONSORED LINK
トップへ戻る