PHPで$_GETがIEでのみ文字化けしてしまう問題

おはようございます、レモンです。

アルバイトでWebアプリケーションを作っていて、
PHPでREST APIをさくっと書いているのですが、IEでだけ文字化けして返ってきてるようでした。

環境はPHP5系で、ググってみたらよくあるバグのようで対処法をいくつか試してみたけどなんかうまく行かなくてぐぬぬって感じだったのでφ(..)メモメモ。
一応$_GETで取ったヤツを変数に突っ込んでJSONに変更してる感じです。

うまくいった対処法

IEだけ文字化けして戻ってくるのならば、文字化けしている文字コードを判定して、
その時だけUTF-8にしてしまえばいいという発想。
…普通だな!

$word = $_GET["word"];
$encoding = mb_detect_encoding($word, "utf8, JIS, eucjp-win, sjis-win");
if($encoding == "SJIS-win"){
    $word = mb_convert_encoding($word, "utf8", "sjis-win");
}

とりあえず、普通に$_GETで取得をしてから、mb_detect_encodingで文字コードを判定。
注意しておきたいのは、第2引数でutf8を一番最初にしておいて、あとはありえそうな文字コードを後ろに並べておくこと。
こうしないと、日本語ってだけでUTF-8なのにJISとか判定されたりする。

あとは、予めIEがどんな感じの文字コードを返すのかを調べておいて、その時だけmb_convert_encodingで変換。
今回は変更する文字コードとされる文字コードがはっきりしているので、引数にそれをツッコんでおく。

うまくいかなかった対処法

以下は今回うまく行かなかった対処法です。
もちろんうまくいくこともあるかも。その辺はPHP特有のテキトー感満載。

headerをアップデートする

headerで明示的にUTF-8で返ってくるように示せばいいんじゃないか、という対処法。

header("Content-Type: application/json; charset=utf-8");

を付けてみる。特に変化がない。
そもそもこれは出力するときのヘッダだから当たり前といえば当たり前である。

入力時にurlencodeする

ググったらこれが一番引っかかったかも。
ただ、入力側のViewもPHPにしなきゃいけなかったのでボツだった。
(今回は生えHTMLに書いたjQueryで値を取得してた)

やり方は簡単で、

"hope.php?word=<?= urlencode("ワード"); ?>"

という感じで投げてあげる。
こうすれば、いい塩梅にエンコードしてくれるらしい?

PHPは全然慣れていないので、この辺のアタリマエのこともかなり戸惑ってしまいますね。。。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください