PHPのjson_encodeがUTF-8がエラーになってしまう時に対処方法


PHPでjson_encodeがUTF-8を指定していても、なぜか以下のエラーになる場合があります。

PHP Warning: json_encode() Invalid UTF-8 sequence in argument

文字コードの変換はUTF-8にきちんと処理させていますので、変換がうまくいっていない様子です。
ためしに文字コードを確認してみるとちゃんとUTF-8になっている!
ということはもうバグの領域にしか思えないですね。

SPONSORED LINK

不正文字列の除去

このエラーは「不正な文字列が含まれてしまっているよ」というエラーです。
つまり、内部的にまだUTF-8に変換しきれていないゴミが残っているような状況でしょう。

そもそもどの文字列がエラーなのかを細かく気にできる量ではありませんでしたので、不正文字列をもう一度UTF-8に変換してしまう方法があります。

少し気持ち悪いですが。

$hoge = mb_convert_encoding($str, "utf8", "auto");
$hoge = mb_convert_encoding($str, "utf8", "utf8"); //もう一回

これでエラーはでなくなります。
文字コードが一度目だけでは完璧に変換しきれないというよりは、変換時にゴミが混入する感覚ですね。

さらに詳しく掘り下げているとiconvを利用する方法もありそうです。

iconvはmb_convert_encodingと違って変換できない文字列に対する処理を変える事ができます。
$str = iconv('UTF-8', 'UTF-8//IGNORE', $str);

//TRANSLITは、置き換え文字になります。
//IGNOREは、削除されます。

上記コードの場合だと、UTF-8に対応する文字でない場合には削除が行われるわけですね。

まとめ

今回の場合はどちらの方法でも対応可能でしたが、結果から推測するとUTF-8に変換できない文字の処理を明示する必要があるという事ですね。
UTF-8の繰り返しによる処理では「変換できなかった文字」をもう一度よく見ろよ?と。
iconvでは、「変換できなかった文字」をどう料理するかを決めておく。

いずれにしても、文字コードの判別でUTF-8だと判断される文字列でエラーが出るわけですから、日本語や機種依存文字に対する呪縛は深そうです。

SPONSORED LINK
トップへ戻る