文字コードが違う!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は鬼門です。

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

関連トピック

Question

PHPのdate関数で「年」が文字化けした時の対処方法

PHPのエラーについて「PHP date 年 文字化け」です。 PHPで日付を表示する時に欠かせないdate関数ですが「Y年」が文字化

Download

PHPで画像ダウンロードのボタンでリンクする方法

PHPを利用して画像をダウンロードさせるボタンを作成する方法メモです。 リンクボタンをクリックすると保存ダイアログが表示されて、ダウン

Mail

PHPエラー対処方法「malformed header from script. Bad header=No recipient addresses found i」

PHPからメールを送信する際に「malformed header from script. Bad header=No recipien

php

PHPエラー対処法 First argument should be an array

[code] First argument should be an array [/code] このエラーは、 最初の引数

Way

JavaScriptでUA判別してスマホとタブレットを振り分ける方法

JavaScriptを使用してUAでiPhoneやAndroidのスマホを判定したり、増加傾向にあるタブレットを判別する方法メモ。 U

earth

PHPなどでDB不要のブログがまだまだ使えそう

データベースまで利用してわざわざ作るほどでもないブログや、 データベースが使えないサーバーだったり、 とにかく軽量化されたブログを目

mysql_limit_pf

MySQLのlimitで大量データのパフォーマンスが遅い重い!

MySQLのlimitを使用した場合、オフセット部分が増えるとパフォーマンスが低下する場合の対処方法メモ。 データベースからlimit

php_timestamp

PHPでタイムスタンプを変換して日付を表示する

PHPでタイムスタンプへの変換とタイムスタンプからの変換メモです。 データベースの日付型からの出力などで使ったり、xmlやRSSでの日

公開日:2013/12/08