json_encode() turn non-UTF8 strings into null, but

2019-09-02 05:38发布

问题:

In the framework I have to use for a project (Lithium) the output on a specific page goes through json_encode(). Locally and on live I try with one and the same data, and the result is:

  1. Locally it returns the JSON, but some of the values are turned into null.
  2. Live site - it returns false.

In both cases when I run json_last_error() - it gives me int(5). I can run phpinfo() on both places, if some setting is causing the problem. (Locally I'm with PHP 5.3.*, on live it's 5.5.9.)

回答1:

Actually you need to use optional parameters of json_encode in case of UTF8 characters

So You can use

JSON_UNESCAPED_UNICODE option of JSON_ENCODE

Example:

json_encode($array, JSON_UNESCAPED_UNICODE)


回答2:

Visit php documentation here.

Although this is not documented on the version log here, non-UTF8 handling behaviour has changed in 5.5, in a way that can make debugging difficult.

Passing a non UTF-8 string to json_encode() will make the function return false in PHP 5.5, while it will only nullify this string (and only this one) in previous versions.

In a Latin-1 encoded file, write this:

$a = array('é', 1);
var_dump(json_encode($a));

PHP < 5.4: string(8) "[null,1]"

PHP >= 5.5: bool(false)

PHP 5.5 has it right of course (if encoding fails, return false) but its likely to introduce errors when updating to 5.5 because previously you could get the rest of the JSON even when one string was not in UTF8 (if this string wasn't used, you'd never notify it's nulled)



回答3:

Finally - I used a slightly modified version of this gist - http://gist.github.com/oscar-broman/3653399 - but instead of encoding properties - I'm removing all the non-UTF8 strings ... and it's working. But - I had to modify the PHP framework the website is using ... and this is something I was really trying to avoid ... ... ... ... but anyway, this approach does the job for now :) ...