BOM付きUTF-8で返却されるJSONでBOMを消す

PHP

■なんでか知らないが、json_decodeするとnull(syntax_error)で何も戻らない

以下の様なコードを書いていました。普通にJSONを取得してデコードして戻すものです。

$jsonData = file_get_contents("ここにURLを");

if (empty($jsonData)) {
    throw new Exception('JSONデータにアクセスできませんでした。');
}

$jsonData = json_decode($jsonData, true);

 

JSONは正しく戻ってきているのに、なぜかjson_decodeがNULLで戻ってしまいます。また、CakePHPを利用していたのですがpr()で表示したJSONはエラーになり、echoで表示したJSONは正常に動くという、とてもいやらしい挙動をしていました。

 

■原因はBOM付きのUTF-8の文字コード

また文字コードだー。うおーー。

BOMがついているUTF-8の文字コードのJSONで戻してくるAPIでした。BOMは以下のようなコードで削除することができました。

$jsonData = file_get_contents("ここにURL");

if (empty($jsonData)) {
    throw new Exception('JSONデータにアクセスできませんでした。');
}

$bom = pack('H*','EFBBBF');
$jsonData = preg_replace("/^$bom/", '', $jsonData);
$jsonDecode =  json_decode($jsonData, true);

 

また文字コードのやつに時間を取られてしまいました。うーむ。