ソフトウェア開発者の日常

こだわりなく書きたいことを書いていきます。

PHP:¥マークの判定動作ではまった

久しぶりに¥マークではまった。何年ぶりくらいだろ。

f:id:AJYA:20121004212715j:plain

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_関数を使うのを当たり前にし、エンコードも意識しなければならない。 

以前はまったときは、「表」という漢字だった。