标题:php json 处理gbk转码utf-8问题( json_encode转换数组,值为null) 出处:刘新修 时间:Tue, 28 Jul 2020 13:40:35 +0000 作者:刘新修 地址:http://liuxinxiu.com:80/s/300/ 内容: 遇到个很幼稚的问题,用json_encode把数组转换为json时,发现转化的值为null。怎么回事呢?查找手册:发现了下面的话: 该函数只能接受 UTF-8 编码的数据(译注:指字符/字符串类型的数据) 原来数组中有中文,需要转码哦,写个转换字符编码的函数吧: PHP代码 function encodeConvert($str,$fromCode,$toCode) { if (strtoupper($toCode) == strtoupper($fromCode)) return $str; if (is_string($str)) { if (function_exists('mb_convert_encoding')) { return mb_convert_encoding($str, $toCode, $fromCode); } else { return iconv($fromCode, $toCode, $str); } } elseif (is_array($str)) { foreach ($str as $k => $v) { $str[$k] = encodeConvert($v, $fromCode, $toCode); } return $str; } return $str; } 对于数组,通过下面方式json_encode调用,一切ok。 PHP代码 $json_api=json_encode(encodeConvert($json_api,'gb2312','utf-8')); $json_api=json_decode(json_decode($json_api)); 今天数组json_encode转json的时候,输出一片空白,难道是数据量太大了?导致输出空白了?后来检查下php程序似乎没有出错,就是json_encode的时候出现了问题,那到底是什么问题呢? 我们先来说下json_encode这个函数 C#代码 (PHP 5 >= 5.2.0, PECL json >= 1.2.0, PHP 7) json_encode — 对变量进行 JSON 编码 说明 ----------------------------------------------------------- string json_encode ( mixed $value [, int $options = 0 [, int $depth = 512 ]] ) 参数 ----------------------------------------------------------- value 待编码的 value ,除了resource 类型之外,可以为任何数据类型。 所有字符串数据的编码必须是 UTF-8。 options 由以下常量组成的二进制掩码: JSON_HEX_QUOT, JSON_HEX_TAG, JSON_HEX_AMP, JSON_HEX_APOS, JSON_NUMERIC_CHECK, JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES, JSON_FORCE_OBJECT, JSON_PRESERVE_ZERO_FRACTION, JSON_UNESCAPED_UNICODE, JSON_PARTIAL_OUTPUT_ON_ERROR。 depth 设置最大深度。 必须大于0。 返回值 ----------------------------------------------------------- 成功则返回 JSON 编码的 string 或者在失败时返回 FALSE 。 注意:上面对参数明确说明(所有字符串数据的编码必须是 UTF-8) 可能正是因为这一点导致我输出错误,但是我怎么知道,会是这个错误呢?因为我发现有一个这个函数json_last_error 我们看下这个函数 C#代码 (PHP 5 >= 5.3.0, PHP 7) json_last_error — 返回最后发生的错误 说明 ----------------------------------------------------------- int json_last_error ( void ) 如果有,返回 JSON 编码解码时最后发生的错误。 参数 ----------------------------------------------------------- 此函数没有参数。 返回值 ----------------------------------------------------------- 返回一个整型(integer),这个值会是以下的常量之一: C#代码 例如: echo json_encode(array('error' => '0', 'message' => '没有错误')); var_dump(json_last_error()); //这里也可以是json_decode //错误码对照 0 JSON_ERROR_NONE 1 JSON_ERROR_DEPTH 2 JSON_ERROR_STATE_MISMATCH 3 JSON_ERROR_CTRL_CHAR 4 JSON_ERROR_SYNTAX 5 JSON_ERROR_UTF8 6 JSON_ERROR_RECURSION 7 JSON_ERROR_INF_OR_NAN 8 JSON_ERROR_UNSUPPORTED_TYPE 我返回的是 int 5,对照返回错误码,自然而然就是(异常的 UTF-8 字符,也许是因为不正确的编码)这个错误了,知道错误后,然后检查你要返回的数据,再做下处理就OK了。 Generated by Bo-blog 2.1.1 Release