2008/09/30

shift_jisでの5C問題回避法(PHPのみ)

PHPの場合、php.ini内に「Magic Quotes GPC」というオプションがあります。
これはデフォルトでONになっています。
こいつが何をするかといえば、自動でエスケープ文字を取り除くんです。
OFFにしておけばPHP内で害はないのですが、i-modeサイトを作りたい場合や、
MYSQLに検索かけに行く場合などはまた変換かかってエスケープされますので同じです。
URLのエンコード/デコード時にもこの問題がでるはずです。

たとえば「ソ」は「83 5C」です。
Magic Quotes GPCをONのまま「ソ」で検索しようとしたら5Cが取り除かれて
「83」だけで検索にいきます。もちろん「83」な文字はないのでヒット件数はゼロです。

SHIFT_JISの「ソ」をきちんと「ソ」として認識してもらうには「ソ¥¥」と打てば
一番最後¥のだけがエスケープされるので「ソ」と認識してもらえます。

では、PHPでどうやればいいかというと以下のようにします。

get_magic_quotes_gpc()はget_magic_quotes_gpcの値が
何で設定されているかを取得してくれる標準関数です。
「find_word」という名前で画面内のテキストボックスからある値を取得するとします。
addslashes()はエスケープ文字を追加してくれる関数です。

if (!get_magic_quotes_gpc()) {
 $find_word = (($_POST['find_word']));
} else {
 $find_word = (addslashes($_POST['find_word']));
}


addslashesを入れるだけで回避方法は単純な事なのですが、
PHPの理屈がわかっていなかったので非常に難しかったです。

5C文字は「ソ」以外にもあります。以下の40文字です。
SHIFT_JISを使っている場合、一見普通に動いているようにみえても
以下の文字を使ったときに正常な結果が得られないのなら
5C問題が解決されていないという事になります。

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

2008/09/27

文字コード

MySqlデータベースでREINSのデータを不動産検索サイトに
流し込むプログラムを改変していてcsvデータが流し込めない事態に!
なにかエスケープすべき文字があるかと探してみたが見当たらず、

防衛庁に勤めるアキバ系友人にcsvについて質問したところ
『csvはノイズが入るけんテキストの方が確実よ~』
『ノイズ?聞いたことねえ』けどご指摘のテキスト案で開眼。
文字コードを確認して問題を発見。
エクセル書類はshift-jisなのでphpmyadminなどでアップする際はsjisで送信
調べるとsjisとSHIFT-JISは同じことらしいが?なにが違うんだろ??

テキストで開いて改行チェックと文字コードの欠点を発見。
いわゆる"5C系"の文字をエスケープするとのこと。
http://ja.wikipedia.org/wiki/Shift_JIS#.E6.AC.A0.E7.82.B9

北大阪の不動産屋なので能勢とかを入れなきゃならんので
エスケープしまくらんといかん。
めんどくさいし更新のたびの作業となるとミスが多そう。

なので

プログラム全部とhtml書類とデータベースをすべてEUCに書き換えました。
日本語使うプログラムはEUC_JPもしくはUTF-8
ってのが暗黙の?ルールなので。