5C問題 ITかあさん

ITかあさん

PHP shift-jisで発生する文字化け

今日はのっけからつまずいた。
あるサイトのPC版のプログラムを作って、ほぼ完成し、後は携帯用に出力するだけ。PCでは問題なくできたから、後は携帯でも同じ出力をするだけ。
携帯といえば文字コードをshift-jisにするのが一般的ですね。

<meta http-equiv="Content-Type" content="text/html; charset=shift-jis" />

ってヘッダーに書いて、ファイルの文字コードもshift-jisにして、PCと同じスクリプトをぺたってして終了!
・・・と思いきや

Parse error: syntax error, unexpected '"', expecting T_STRING or T_VARIABLE
 or T_NUM_STRING in /home/maxy.jp/public_html/m/girllist.php on line 34

なんとびっくり!syntax errorエラーの発生!
え~~~~!
PCで全くエラーは出なかったのに、突然のエラーでした。エラーの対象となったのはここ。

//6.SQL実行&結果取得
$db->setFetchMode(DB_FETCHMODE_ASSOC);
$syuxtukin = $db->getAll($sql2);
if(DB::isError($syuxtukin)){
echo("$sql2取得エラー");
//データベース切断
$db->disconnect();
}

はい~~~??

Parse error: syntax error, unexpected '"', expecting T_STRING or T_VARIABLE
 or T_NUM_STRING in /home/maxy.jp/public_html/m/girllist.php on line 34

これはもしや!と思って調べたところ、噂の5C問題とかいうやつでした。

5C問題というのは

ソЫ噂浬欺圭構蚕十申曾箪貼能表暴予禄兔喀媾彌拿杤歃濬畚秉綵臀藹觸軆鐔饅鷭

これらの文字をshift-jis環境で使うと、2バイト目が半角の \ と同じコードになってしまいます。
つまり、「”」が一個足らなくなってしまったんですね。
ここはとりあえず、DBからデータを取得する際のエラーを表記しただけなので一般ユーザーには影響ありませんので、

//6.SQL実行&結果取得
$db->setFetchMode(DB_FETCHMODE_ASSOC);
$syuxtukin = $db->getAll($sql2);
if(DB::isError($syuxtukin)){
echo("$sql2 is_error");
//データベース切断
$db->disconnect();
}

と、かっこよくENGLISHにしてひとまず退散。

5C問題が発生した時の解決策

これら5C問題が発生したら、その文字を使うのをやめるか、
<?php echo ‘表\'; ?>
のように余分に \ を入れます。

今日のまとめ

とりあえず、5C問題が発生したら\マークを余分に入れるか、対象となる文字を使わないようにする。
今までshift-jisとは無縁の生活を送ってきましたが、やはり携帯サイトはshift-jisのほうがSEO的にも有効ですし、やや古い機種の場合shift-jisのみしか表示されません。このことからも携帯サイトはshift-jisの文字コードで対応する必要があり、5C問題の解決とは切っても切れない関係にあるようですね。
ますますshift-jisが嫌いになりました。