I have a jQuery AJAX call for a PHP script that retrieves a text value from a database and outputs a JSON object containing it:
$.ajax({ type: "GET", url: "my_script.php", success: function (jsonObj) { if("txt" in jsonObj) { console.log(jsonObj.txt); } }, error: function(jXHR, textStatus, errorThrown) { console.log("The info cannot be loaded.", jXHR, textStatus, errorThrown); }, dataType: "json" });
In PHP, after retrieving the text from the database, I add it to an associative array which I convert into a JSON object displayed as the response of the AJAX call:
$item['txt'] = $value; //$value is the text got from the database header("Content-type: application/json"); echo json_encode($item);
Even though $value is not null, in the response of the AJAX call txt variable has the null value. Which means that json_encode function fails in the case of my text. As I later discovered, that is because the text I got from the database contained non-UTF-8 encoded characters and in the first parameter of the json_encode function, as PHP manual says, `All string data must be UTF-8 encoded.`
So if you want to handle non-UTF-8 encoded characters through jQuery AJAX calls with JSON data type response, you should make your own JSON encoding function. A basic example would be:
function make_json($item) { foreach($item as $key => $value) { if(is_array($value)) { $arr[] = '"'.$key.'":'.make_json($item[$key]); } else { $arr[] = '"'.$key.'":"'.str_replace(array("\\", "\""), array("\\\\", "\\\""), $value).'"'; } } return '{'.implode(",",$arr)."}"; }
And the code in the PHP script goes like:
header("Content-type: application/json; charset=ISO-8859-1"); echo make_json($item);