Posted at

PHPでBOMを削除

More than 3 years have passed since last update.

GooglePlayのランキングを取得できるこのAPI。

http://doroidpanic.com/ws/googleplay-ranking-api/ranking/0

取得してみると、

$feed = file_get_contents('http://doroidpanic.com/ws/googleplay-ranking-api/ranking/0');

$appList = json_decode($feed, true);
var_dump($appList); // null

ん!?null!?実際にブラウザで確認してみるときちんと取得できている。

これが発端で色々調べたのですが、どうやらリターンされるjsonがUTF-8の"BOMあり"で書かれており、うまくデコードできなかったようです。

んでこのBOMなのですが、Byte Order Markという正式名称らしく、要するにデータの先頭にくっつくマーク。バイナリデータでみてみると「EF BB BF」という文字が先頭についています。

これは「これはUTF-8だよ!」ということを表しているみたいです。つまりUTF-8にも、「UTF-8(BOMなし)」「UTF-8(BOMあり)」の2パターンがあるみたいですね。略記としてBOMなしのほうは「UTF-8N」と書かれるみたいです。Nothing、ですかね。

さて、ということでこのBOMを取り除いてやれば一件落着です。

$feed = file_get_contents('http://doroidpanic.com/ws/googleplay-ranking-api/ranking/0');

$appList = json_decode(preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $feed),true);
var_dump($app_List);

// 結果
[
{
position: "1",
title: "1. 【史上最強放置ゲー】バトルダイアリー~新感覚楽ちんRPG~",
icon: "https://lh3.googleusercontent.com/R3TkcFlztdUfX6dEWD7QfF6wFAxaDvyqhBCMIy5LK57yzpQmC583hrGAb9q3c1ZxIZ8=w170",
developer: "",
category: "ロールプレイング",
price: "0"
},

以上です。