PHP:¥マークの判定動作ではまった
久しぶりに¥マークではまった。何年ぶりくらいだろ。
photo credit: Kaptain Kobold via photopin cc
ことの発端
¥マークが含まれているかチェックするために、
$str = "入金予定"; $pos = strpos( $str, "¥¥"); if ( $pos !== false ) { echo("a"); }
としていたら、if文の中が処理されていた。
調査
¥マークをシングルクオートで囲ったり、$posの値を確認したりしていたが、なぜ$posに数値が戻ってくるのかさっぱりわからなかった。
エディタに文字列を貼り付けて、なにが問題なのか考えていたら、2バイトコードのどこかに、¥マークの文字コードの0x5cが含まれているのではないかと思って調べたら、「予」に0x5cが含まれていた。
対処
調べたらマルチバイト用のmb_strposがあったので、
$str = "入金予定"; $pos = mb_strpos( $str, "¥¥"); if ( $pos !== false ) { echo("a"); }
としても動作が変わらない。
エンコードの指定すればいいのかと考えて、
$str = "入金予定"; $pos = mb_strpos( $str, "¥¥", 0, "SJIS-win" ); if ( $pos !== false ) { echo("a"); }
としたら、期待通りの動作になった。
今日学んだこと
2バイトコードを扱うときは、mb_関数を使うのを当たり前にし、エンコードも意識しなければならない。
以前はまったときは、「表」という漢字だった。