diff --git a/cmpUtil.php b/cmpUtil.php index e330f9a..f738d56 100644 --- a/cmpUtil.php +++ b/cmpUtil.php @@ -44,24 +44,24 @@ return $re; } - function errorJSON($err) { + function errorJSON($err, $f = 2) { switch($err) { - case JSON_ERROR_NONE : $this->e('Ошибок нет' , 1); break; - case JSON_ERROR_DEPTH : $this->e('Достигнута максимальная глубина стека' , 1); break; - case JSON_ERROR_STATE_MISMATCH : $this->e('Некорректные разряды или не совпадение режимов' , 1); break; - case JSON_ERROR_CTRL_CHAR : $this->e('Некорректный управляющий символ' , 1); break; - case JSON_ERROR_SYNTAX : $this->e('Синтаксическая ошибка, не корректный JSON' , 1); break; - case JSON_ERROR_UTF8 : $this->e('Некорректные символы UTF-8, возможно неверная кодировка' , 1); break; - case JSON_ERROR_RECURSION : $this->e('Одна или несколько зацикленных ссылок в кодируемом значении' , 1); break; - case JSON_ERROR_INF_OR_NAN : $this->e('Одно или несколько значений NAN или INF в кодируемом значении' , 1); break; - case JSON_ERROR_UNSUPPORTED_TYPE : $this->e('Передано значение с неподдерживаемым типом' , 1); break; - case JSON_ERROR_INVALID_PROPERTY_NAME : $this->e('Имя свойства не может быть закодировано' , 1); break; - case JSON_ERROR_UTF16 : $this->e('Некорректный символ UTF-16, возможно некорректно закодирован' , 1); break; - default : $this->e('Неизвестная ошибка' , 1); break; + case JSON_ERROR_NONE : $this->e('Ошибок нет' , $f); break; + case JSON_ERROR_DEPTH : $this->e('Достигнута максимальная глубина стека' , $f); break; + case JSON_ERROR_STATE_MISMATCH : $this->e('Некорректные разряды или не совпадение режимов' , $f); break; + case JSON_ERROR_CTRL_CHAR : $this->e('Некорректный управляющий символ' , $f); break; + case JSON_ERROR_SYNTAX : $this->e('Синтаксическая ошибка, не корректный JSON' , $f); break; + case JSON_ERROR_UTF8 : $this->e('Некорректные символы UTF-8, возможно неверная кодировка' , $f); break; + case JSON_ERROR_RECURSION : $this->e('Одна или несколько зацикленных ссылок в кодируемом значении' , $f); break; + case JSON_ERROR_INF_OR_NAN : $this->e('Одно или несколько значений NAN или INF в кодируемом значении' , $f); break; + case JSON_ERROR_UNSUPPORTED_TYPE : $this->e('Передано значение с неподдерживаемым типом' , $f); break; + case JSON_ERROR_INVALID_PROPERTY_NAME : $this->e('Имя свойства не может быть закодировано' , $f); break; + case JSON_ERROR_UTF16 : $this->e('Некорректный символ UTF-16, возможно некорректно закодирован' , $f); break; + default : $this->e('Неизвестная ошибка' , $f); break; } } - function decodeJSONRaw($str) { + function decodeJSONRaw($str, $f = 2) { $obj = json_decode( $str , // string $json true , // ?bool $associative = null @@ -74,11 +74,42 @@ if($err === JSON_ERROR_NONE) return $this->toArray($obj); - $this->errorJSON($err); + $this->errorJSON($err, $f + 1); + + $this->d("Invalid JSON: " . $str, $f); return null; } + function decodeJSON($str, $d = 0) { + $m = array(); + + // eq '/[[:cntrl:]]/u'; + $re = '/[\x00-\x1F\x7F]/u'; + + if(preg_match_all($re, $str, $m)) { + $tr = array(); + + for($i = 0; $i < count($m[0]); $i++) { + $bin = $m[0][$i]; + + if(isset($tr[$bin])) + continue; + + $hex = "0x" . bin2hex($bin); + + $tr[$bin] = $hex; + + if($d) + $this->d("decodeJSON: Translate " . $hex); + } + + $str = strtr($str, $tr); + } + + return $this->decodeJSONRaw($str, 6); + } + function encodeJSON($obj) { $text = json_encode($obj, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); @@ -110,7 +141,7 @@ return false; } - $obj = $this->decodeJSONRaw($raw); + $obj = $this->decodeJSON($raw, 1); if(!$obj) { $this->e("Invalid JSON '$file'");