From 22134018a96760a4c59fe9c385d3b5c041d88eff Mon Sep 17 00:00:00 2001 From: ftimme <ft@falkotimme.com> Date: Mon, 14 May 2012 18:22:55 -0400 Subject: [PATCH] - Modified json_encode function for PHP < 5.2.0. --- interface/lib/classes/functions.inc.php | 84 +++++++++++++++++++++++++++-------------- 1 files changed, 55 insertions(+), 29 deletions(-) diff --git a/interface/lib/classes/functions.inc.php b/interface/lib/classes/functions.inc.php index 2fe7191..dc21608 100644 --- a/interface/lib/classes/functions.inc.php +++ b/interface/lib/classes/functions.inc.php @@ -111,38 +111,64 @@ function json_encode($data) { if(!function_exists('json_encode')){ - switch ($type = gettype($data)){ - case 'NULL': - return 'null'; - case 'boolean': - return ($data ? 'true' : 'false'); - case 'integer': - case 'double': - case 'float': - return $data; - case 'string': - return '"' . addslashes($data) . '"'; - case 'object': - $data = get_object_vars($data); - case 'array': - $output_index_count = 0; - $output_indexed = array(); - $output_associative = array(); - foreach($data as $key => $value){ - $output_indexed[] = $this->json_encode($value); - $output_associative[] = $this->json_encode($key) . ':' . $this->json_encode($value); - if($output_index_count !== NULL && $output_index_count++ !== $key){ - $output_index_count = NULL; - } + if(is_array($data) || is_object($data)){ + $islist = is_array($data) && (empty($data) || array_keys($data) === range(0,count($data)-1)); + + if($islist){ + $json = '[' . implode(',', array_map(array($this, "json_encode"), $data) ) . ']'; + } else { + $items = Array(); + foreach( $data as $key => $value ) { + $items[] = $this->json_encode("$key") . ':' . $this->json_encode($value); } - if($output_index_count !== NULL){ - return '[' . implode(',', $output_indexed) . ']'; - } else { - return '{' . implode(',', $output_associative) . '}'; + $json = '{' . implode(',', $items) . '}'; + } + } elseif(is_string($data)){ + # Escape non-printable or Non-ASCII characters. + # I also put the \\ character first, as suggested in comments on the 'addclashes' page. + $string = '"'.addcslashes($data, "\\\"\n\r\t/".chr(8).chr(12)).'"'; + $json = ''; + $len = strlen($string); + # Convert UTF-8 to Hexadecimal Codepoints. + for($i = 0; $i < $len; $i++){ + $char = $string[$i]; + $c1 = ord($char); + + # Single byte; + if($c1 <128){ + $json .= ($c1 > 31) ? $char : sprintf("\\u%04x", $c1); + continue; } - default: - return ''; // Not supported + + # Double byte + $c2 = ord($string[++$i]); + if(($c1 & 32) === 0){ + $json .= sprintf("\\u%04x", ($c1 - 192) * 64 + $c2 - 128); + continue; + } + + # Triple + $c3 = ord($string[++$i]); + if(($c1 & 16) === 0){ + $json .= sprintf("\\u%04x", (($c1 - 224) <<12) + (($c2 - 128) << 6) + ($c3 - 128)); + continue; + } + + # Quadruple + $c4 = ord($string[++$i]); + if(($c1 & 8) === 0){ + $u = (($c1 & 15) << 2) + (($c2>>4) & 3) - 1; + + $w1 = (54<<10) + ($u<<6) + (($c2 & 15) << 2) + (($c3>>4) & 3); + $w2 = (55<<10) + (($c3 & 15)<<6) + ($c4-128); + $json .= sprintf("\\u%04x\\u%04x", $w1, $w2); + } + } + } else { + # int, floats, bools, null + $json = strtolower(var_export($data, true)); } + return $json; } else { return json_encode($data); } -- Gitblit v1.9.1