- <?php
- /**
- * @author 王亚超
- * 重写YII的CJSON为WJSON输出model支持自定义变量
- * Class WJSON
- */
- class WJSON extends CJSON {
- protected static function nameValue($name, $value) {
- return self::encode(strval($name)) . ':' . self::encode($value);
- }
- public static function encode($var) {
- switch (gettype($var)) {
- case 'boolean':
- return $var ? 'true' : 'false';
- case 'NULL':
- return 'null';
- case 'integer':
- return (int)$var;
- case 'double':
- case 'float':
- return str_replace(',', '.', (float)$var); // locale-independent representation
- case 'string':
- if (($enc = strtoupper(Yii::app()->charset)) !== 'UTF-8')
- $var = iconv($enc, 'UTF-8', $var);
- if (function_exists('json_encode'))
- return json_encode($var);
- // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT
- $ascii = '';
- $strlen_var = strlen($var);
- /*
- * Iterate over every character in the string,
- * escaping with a slash or encoding to UTF-8 where necessary
- */
- for ($c = 0; $c < $strlen_var; ++$c) {
- $ord_var_c = ord($var{$c});
- switch (true) {
- case $ord_var_c == 0x08:
- $ascii .= '\\b';
- break;
- case $ord_var_c == 0x09:
- $ascii .= '\\t';
- break;
- case $ord_var_c == 0x0A:
- $ascii .= '\\n';
- break;
- case $ord_var_c == 0x0C:
- $ascii .= '\\f';
- break;
- case $ord_var_c == 0x0D:
- $ascii .= '\\r';
- break;
- case $ord_var_c == 0x22:
- case $ord_var_c == 0x2F:
- case $ord_var_c == 0x5C:
- // double quote, slash, slosh
- $ascii .= '\\\\' . $var{$c};
- break;
- case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)):
- // characters U-00000000 - U-0000007F (same as ASCII)
- $ascii .= $var{$c};
- break;
- case (($ord_var_c & 0xE0) == 0xC0):
- // characters U-00000080 - U-000007FF, mask 110XXXXX
- // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
- $char = pack('C*', $ord_var_c, ord($var{$c + 1}));
- $c += 1;
- $utf16 = self::utf8ToUTF16BE($char);
- $ascii .= sprintf('\\u%04s', bin2hex($utf16));
- break;
- case (($ord_var_c & 0xF0) == 0xE0):
- // characters U-00000800 - U-0000FFFF, mask 1110XXXX
- // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
- $char = pack('C*', $ord_var_c,
- ord($var{$c + 1}),
- ord($var{$c + 2}));
- $c += 2;
- $utf16 = self::utf8ToUTF16BE($char);
- $ascii .= sprintf('\\u%04s', bin2hex($utf16));
- break;
- case (($ord_var_c & 0xF8) == 0xF0):
- // characters U-00010000 - U-001FFFFF, mask 11110XXX
- // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
- $char = pack('C*', $ord_var_c,
- ord($var{$c + 1}),
- ord($var{$c + 2}),
- ord($var{$c + 3}));
- $c += 3;
- $utf16 = self::utf8ToUTF16BE($char);
- $ascii .= sprintf('\\u%04s', bin2hex($utf16));
- break;
- case (($ord_var_c & 0xFC) == 0xF8):
- // characters U-00200000 - U-03FFFFFF, mask 111110XX
- // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
- $char = pack('C*', $ord_var_c,
- ord($var{$c + 1}),
- ord($var{$c + 2}),
- ord($var{$c + 3}),
- ord($var{$c + 4}));
- $c += 4;
- $utf16 = self::utf8ToUTF16BE($char);
- $ascii .= sprintf('\\u%04s', bin2hex($utf16));
- break;
- case (($ord_var_c & 0xFE) == 0xFC):
- // characters U-04000000 - U-7FFFFFFF, mask 1111110X
- // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
- $char = pack('C*', $ord_var_c,
- ord($var{$c + 1}),
- ord($var{$c + 2}),
- ord($var{$c + 3}),
- ord($var{$c + 4}),
- ord($var{$c + 5}));
- $c += 5;
- $utf16 = self::utf8ToUTF16BE($char);
- $ascii .= sprintf('\\u%04s', bin2hex($utf16));
- break;
- }
- }
- return '"' . $ascii . '"';
- case 'array':
- // treat as a JSON object
- if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) {
- return '{' .
- join(',', array_map(array('WJSON', 'nameValue'),
- array_keys($var),
- array_values($var)))
- . '}';
- }
- // treat it like a regular array
- return '[' . join(',', array_map(array('WJSON', 'encode'), $var)) . ']';
- case 'object':
- if ($var instanceof Traversable) {
- $vars = array();
- foreach ($var as $k => $v)
- $vars[$k] = $v;
- } else
- $vars = get_object_vars($var);
- // related
- foreach ($var->relations() as $key => $related) {
- if ($var->hasRelated($key)) {
- $vars[$key] = $var->$key;
- }
- }
- return '{' .
- join(',', array_map(array('WJSON', 'nameValue'),
- array_keys($vars),
- array_values($vars)))
- . '}';
- default:
- return '';
- }
- }
- }
- //该片段来自于http://www.codesnippet.cn/detail/1901201614457.html
来源: http://www.codesnippet.cn/detail/1901201614457.html