How to save a JSON as unescaped UTF-8 in PHP 5.3?
15,265
Solution 1
If you can't use JSON_UNESCAPED_UNICODE
, you could probably unescape the JSON yourself after it's been encoded:
$json = array(
'Sample' => array(
'context' => 'جمهوری اسلامی ایران'
)
);
$encoded = json_encode($json);
var_dump($encoded); // context: "\u062c\u0645..."
$unescaped = preg_replace_callback('/\\\\u(\w{4})/', function ($matches) {
return html_entity_decode('&#x' . $matches[1] . ';', ENT_COMPAT, 'UTF-8');
}, $encoded);
var_dump($unescaped); // context is unescaped
file_put_contents('sample.json', $unescaped);
Here's an example in PHP5.3.
However, this shouldn't be necessary, as any JSON parser should correctly parse the escaped Unicode characters and give you back your original string.
EDIT: A better pattern to use might be /(?<!\\\\)\\\\u(\w{4})/
, which avoids incorrectly unescaping a JSON sequence like "\\u1234"
. See an example.
Solution 2
Perfect Implemention
- Compatible with
\\
(escaped backslashes itself) - Compatible with
JSON_HEX_*
flags
function raw_json_encode($input, $flags = 0) {
$fails = implode('|', array_filter(array(
'\\\\',
$flags & JSON_HEX_TAG ? 'u003[CE]' : '',
$flags & JSON_HEX_AMP ? 'u0026' : '',
$flags & JSON_HEX_APOS ? 'u0027' : '',
$flags & JSON_HEX_QUOT ? 'u0022' : '',
)));
$pattern = "/\\\\(?:(?:$fails)(*SKIP)(*FAIL)|u([0-9a-fA-F]{4}))/";
$callback = function ($m) {
return html_entity_decode("&#x$m[1];", ENT_QUOTES, 'UTF-8');
};
return preg_replace_callback($pattern, $callback, json_encode($input, $flags));
}
Example
<?php
$json = array(
'Sample' => array(
'specialchars' => '<x>& \' "</x>',
'backslashes' => '\\u0020',
'context' => 'جمهوری اسلامی ایران',
)
);
echo raw_json_encode($json, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT);
/*
{"Sample":{"specialchars":"\u003Cx\u003E\u0026 \u0027 \u0022\u003C\/x\u003E","backslashes":"\\u0020","context":"جمهوری اسلامی ایران"}}
*/
Comments
-
Saeed Masoumi almost 2 years
I created a JSON file:
$json = array( "Sample" =>array( "context" => $context, "date" => $date ) ); $url= "sample.json"; $myfile = fopen($url, "w") or die("Unable to open file!"); fwrite($myfile, json_encode($json)); fclose($myfile);
I need to save it as UTF-8 and I can't use
JSON_UNESCAPED_UNICODE
in PHP 5.3. So what should I do now? -
cmbuckley almost 10 yearsThis won't work, as it's not an encoding issue; multibyte characters are escaped as
\uXXXX
.json_encode('é') == '\u00e9'
. -
KalenGi over 8 yearsThis is not working for the string ".u00a0.u00a0.u00a0" which should be ". . . "