お勉強 :  PHPでstrposがマッチしない 

久しぶりにどハマりしたので自分用にもメモ。
何の変哲もない数値が入っているCSVファイルを読み込んで、
1行ずつstrposで文字列が含まれているか確認しようとしたが、
なぜか目で見ると同じなのにデータ的にマッチしてくれない。
strposの返り値が false になってしまう。

なんで?と思って元のCSVファイルをバイナリエディタで覗くと、
ファイル先頭には0xFFFEとあり、これはBOMコードだと気付く。
ついでに単なる半角文字だから8バイトだろうと当たり前に
思っていたが、実データは16バイトだった。
UTF-16だ!とここで気付く。

そこで、スクリプト自体はSJISでできていたので勢いよくこう
変換してみたが、今度は(株)のすぐ後ろに半角カンマが並んで
いる場合に、splitやexplode、fgetcsvでうまく配列へ分割して
くれない。また困った。

$row = mb_convert_encoding($str, "SJIS", "UTF-16");

そういえばUTF-16にはビックエインディアンとリトルエイン
ディアンがあるというのを思い出した。エインディアンなんて
情報処理者試験で勉強したのとPICをいじくるときに使った
っきりだったが、ここで見事にハマってしまった。

mb関数で "UTF-16" と指定すると、BOMコードを読んで
BEとLEの適切なほうへ変換してくれるそうだが、これは
入力する文字列の先頭に都度BOMコードが入っていな
いとうまく動かないものだとわかった。

結局、自分でちゃんとLEと指定することで何とかなった。
UTF-8ばっかり使っていたので、16の事でえらい時間を
食ってしまった。

$row = mb_convert_encoding($str, "SJIS", "UTF-16LE");

足指を骨折した手前、ただでさえ運動不足なのに
余計に歩かないので体重が増えていくw
さて、今晩の体重は 77.3kg でした。

[ 2016/04/26 22:10 ] お勉強 | TB(0) | CM(0)
コメントの投稿








管理者にだけ表示を許可する