php json 处理gbk转码utf-8问题( json_encode转换数组,值为null)
		
		
		[
 2020/07/28 13:40 | by 刘新修 ]
		
	
 2020/07/28 13:40 | by 刘新修 ]
		遇到个很幼稚的问题,用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了。


  
 
 
 
 
 


