JSON option to force unicode
- Pavel Kravčík
- Member | 1195
I'm using PHP version > 5.5, but I need Unicode output. Native json_encode($data) returns Unicode output until I add JSON_UNESCAPED_UNICODE. But Nette doesn't let me choice and force non-Unicode output.
Yeah, I can simply workaround here by extending this class. IMHO this function should has one more parameter or some settings if we already have JSON class.
My point is – output shouldn't be dependend on PHP version but on options instead.
Silly example:
/**
* Returns the JSON representation of a value.
* @param mixed
* @param int accepts Json::PRETTY
* @return string
*/
public static function encode($value, $options = 0, $FORCE_UNICODE)
{
if($FORCE_UNICODE)
{
$flags = 0;
}
else
{
$flags = PHP_VERSION_ID >= 50400 ? (JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | ($options & self::PRETTY ? JSON_PRETTY_PRINT : 0)) : 0;
}
if (PHP_VERSION_ID < 50500) {
$json = Callback::invokeSafe('json_encode', array($value, $flags), function($message) { // needed to receive 'recursion detected' error
throw new JsonException($message);
});
} else {
$json = json_encode($value, $flags);
}
if ($error = json_last_error()) {
$message = isset(static::$messages[$error]) ? static::$messages[$error]
: (PHP_VERSION_ID >= 50500 ? json_last_error_msg() : 'Unknown error');
throw new JsonException($message, $error);
}
$json = str_replace(array("\xe2\x80\xa8", "\xe2\x80\xa9"), array('\u2028', '\u2029'), $json);
return $json;
}
Last edited by kzk_cz (2015-02-23 13:49)
- Jan Tvrdík
- Nette guru | 2595
WTF? Nette does return valid JSON with unicode characters. What is your problem?
- enumag
- Member | 2118
@kzk_cz The default options are dependent on PHP version because the flags don't exist in PHP 5.3.
@JanTvrdík If I get it correctly he wishes to have the unicode
characters escaped for whatever reason. Which means he wants to disable the
JSON_UNESCAPED_UNICODE
flag. It could be implemented as another
flag for the $options
parameter, certainly not as a third
parameter.
- Jan Tvrdík
- Nette guru | 2595
@enumag I get that, but his statement are terribly confusing, e.g. he said “Nette doesn't let me choice and force non-Unicode output” which is not true. Nette does return a valid UTF-8 (which is Unicode encoding) string which is a default JSON encoding.
- Pavel Kravčík
- Member | 1195
@JanTvrdík @enumag: Problems are my english skills and my brain. I'm sorry about it.
Yeah, but function json_encode can return old behaviour in new verion of PHP. But Nette disable this option with this condition.
$flags = PHP_VERSION_ID >= 50400 ? (JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | ($options & self::PRETTY ? JSON_PRETTY_PRINT : 0)) : 0;
I just suggest some improvement. That's all. Third parametr is silly example, but I wrote there it is silly example. I just want to clearly show, what is my point.
And I can simply do it myself. Reason is I exporting JSON arrays for third side app, which stores all data in old JSON format. So I need \u0002 and not š. :)
I apologize for upseting you.
- Jan Tvrdík
- Nette guru | 2595
There is no such thing as old and new JSON format. Default encoding of JSON was always UTF-8.