遇到个很幼稚的问题,用json_encode把数组转换为json时,发现转化的值为null。怎么回事呢?查找手册:发现了下面的话:

该函数只能接受 UTF-8 编码的数据(译注:指字符/字符串类型的数据)
 
原来数组中有中文,需要转码哦,写个转换字符编码的函数吧:
PHP代码
  1. function encodeConvert($str,$fromCode,$toCode)  
  2. {  
  3. if (strtoupper($toCode) == strtoupper($fromCode)) return $str;  
  4. if (is_string($str)) {  
  5. if (function_exists('mb_convert_encoding')) {  
  6. return mb_convert_encoding($str, $toCode, $fromCode);  
  7. } else {  
  8. return iconv($fromCode, $toCode, $str);  
  9. }  
  10. } elseif (is_array($str)) {  
  11. foreach ($str as $k => $v) {  
  12. $str[$k] = encodeConvert($v, $fromCode, $toCode);  
  13. }  
  14. return $str;  
  15. }  
  16. return $str;  
  17. }  
对于数组,通过下面方式json_encode调用,一切ok。
PHP代码
  1. $json_api=json_encode(encodeConvert($json_api,'gb2312','utf-8'));  
  2. $json_api=json_decode(json_decode($json_api));  

今天数组json_encode转json的时候,输出一片空白,难道是数据量太大了?导致输出空白了?
后来检查下php程序似乎没有出错,就是json_encode的时候出现了问题,那到底是什么问题呢?

我们先来说下json_encode这个函数

C#代码
  1. (PHP 5 >= 5.2.0, PECL json >= 1.2.0, PHP 7)  
  2. json_encode — 对变量进行 JSON 编码  
  3.   
  4. 说明  
  5. -----------------------------------------------------------  
  6. string json_encode ( mixed $value [, int $options = 0 [, int $depth = 512 ]] )  
  7.   
  8. 参数  
  9. -----------------------------------------------------------  
  10. value  
  11. 待编码的 value ,除了resource 类型之外,可以为任何数据类型。  
  12. 所有字符串数据的编码必须是 UTF-8。  
  13.   
  14. options  
  15. 由以下常量组成的二进制掩码: 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。  
  16.   
  17. depth  
  18. 设置最大深度。 必须大于0。  
  19.   
  20. 返回值  
  21. -----------------------------------------------------------  
  22. 成功则返回 JSON 编码的 string 或者在失败时返回 FALSE 。  

注意:上面对参数明确说明(所有字符串数据的编码必须是 UTF-8)

可能正是因为这一点导致我输出错误,但是我怎么知道,会是这个错误呢?因为我发现有一个这个函数json_last_error

我们看下这个函数

C#代码
  1. (PHP 5 >= 5.3.0, PHP 7)  
  2. json_last_error — 返回最后发生的错误  
  3.   
  4. 说明  
  5. -----------------------------------------------------------  
  6. int json_last_error ( void )  
  7. 如果有,返回 JSON 编码解码时最后发生的错误。  
  8.   
  9. 参数  
  10. -----------------------------------------------------------  
  11. 此函数没有参数。  
  12.   
  13. 返回值  
  14. -----------------------------------------------------------  
  15. 返回一个整型(integer),这个值会是以下的常量之一:  
C#代码
  1. 例如:  
  2. echo json_encode(array('error' => '0''message' => '没有错误'));  
  3. var_dump(json_last_error());  
  4. //这里也可以是json_decode  
  5.   
  6. //错误码对照  
  7. 0 JSON_ERROR_NONE  
  8. 1 JSON_ERROR_DEPTH  
  9. 2 JSON_ERROR_STATE_MISMATCH  
  10. 3 JSON_ERROR_CTRL_CHAR  
  11. 4 JSON_ERROR_SYNTAX  
  12. 5 JSON_ERROR_UTF8  
  13. 6 JSON_ERROR_RECURSION  
  14. 7 JSON_ERROR_INF_OR_NAN  
  15. 8 JSON_ERROR_UNSUPPORTED_TYPE  

我返回的是 int 5,对照返回错误码,自然而然就是(异常的 UTF-8 字符,也许是因为不正确的编码)这个错误了,知道错误后,然后检查你要返回的数据,再做下处理就OK了。

PHP/Java/Go | 评论(0) | 引用(0) | 阅读(2941)