PHP json_encode() 函数详解及中文乱码问题


Posted in PHP onNovember 05, 2015

在 php 中使用 json_encode() 内置函数(php > 5.2)可以使用得 php 中数据可以与其它语言很好的传递并且使用它。

这个函数的功能是将数值转换成json数据存储格式。

<?php
$arr = array
  (
   'Name'=>'希亚',
   'Age'=>
  );
$jsonencode = json_encode($arr);
echo $jsonencode;
?>

程序运行结果如下:

{"Name":null,"Age":}

json_encode 函数中中文被编码成 null 了,Google 了一下,很简单,为了与前端紧密结合,Json 只支持 utf- 编码,我认为是前端的 Javascript 也是 utf- 的原因。

<?php
$array = array
 (
  'title'=>iconv('gb','utf-','这里是中文标题'),
  'body'=>'abcd...'
 );
echo json_encode($array);
?>

这个程序的运行结果为:

{"title":"\u8fd9\u91cc\u662f\u4e2d\u6587\u6807\u9898","body":"abcd..."}

数组中所有中文在json_encode之后都不见了或者出现\u2353等。

解决方法是用urlencode()函数处理以下,在json_encode之前,把所有数组内所有内容都用urlencode()处理一下,然用json_encode()转换成json字符串,最后再用urldecode()将编码过的中文转回来。

<?php
/**************************************************************
 *
 * 使用特定function对数组中所有元素做处理
 * @param string &$array  要处理的字符串
 * @param string $function 要执行的函数
 * @return boolean $apply_to_keys_also  是否也应用到key上
 * @access public
 *
 *************************************************************/
function arrayRecursive(&$array, $function, $apply_to_keys_also = false)
{
 static $recursive_counter = ;
 if (++$recursive_counter > ) {
  die('possible deep recursion attack');
 }
 foreach ($array as $key => $value) {
  if (is_array($value)) {
   arrayRecursive($array[$key], $function, $apply_to_keys_also);
  } else {
   $array[$key] = $function($value);
  }
  if ($apply_to_keys_also && is_string($key)) {
   $new_key = $function($key);
   if ($new_key != $key) {
    $array[$new_key] = $array[$key];
    unset($array[$key]);
   }
  }
 }
 $recursive_counter--;
}
/**************************************************************
 *
 * 将数组转换为JSON字符串(兼容中文)
 * @param array $array  要转换的数组
 * @return string  转换得到的json字符串
 * @access public
 *
 *************************************************************/
function JSON($array) {
 arrayRecursive($array, 'urlencode', true);
 $json = json_encode($array);
 return urldecode($json);
}
$array = array
  (
   'Name'=>'希亚',
   'Age'=>
  );
echo JSON($array);
?>

这次成功了,运行结果如下:

{"Name":"希亚","Age":"20"}

下面给大家介绍PHP json_encode中文乱码解决方法

相信很多人在使用Ajax与后台php页面进行交互的时候都碰到过中文乱码的问题。JSON作为一种轻量级的数据交换格式,备受亲睐,但是用PHP作为后台交互,容易出现中文乱码的问题。JSON和js一样,对于客户端的字符都是以UTF8的形式进行处理的,也就是说,使用JSON作为提交和接收的数据格式时字符都采用UTF8编码处理,当我们的页面编码和数据库编码不是采用UTF8的时候,就极容易出现中文乱码的问题。解决办法自然是在用js或者PHP处理JSON数据的时候都采用UTF8的形式

  PHP5.2或以上的版本把json_encode作为内置函数来用,给网站制作者带来了很大的方便,但是我们必须注意到json_encode只支持UTF8编码的字符,否则,中文乱码或者空值就出现了。

解决办法分为以下两个步骤。

Step1

保证在使用JSON处理的时候字符是以UTF8编码的。具体我们可以把数据库编码和页面编码都改为UTF8。当然喜欢用gbk编码的话,可以在进行JSON处理前,把字符转为UTF8形式。在PHP中有如下方法:

<?php 
  $data="JSON中文"; 
  $newData=iconv("GB2312","UTF-8//IGNORE",$data); 
  echo $newData; 
  //ignore的意思是忽略转换时的错误,如果没有ignore参数,所有该字符后面的字符都不会被保存。 
  //或是("GB2312","UTF-8",$data); 
?>

Step2

 后台PHP页面(页面编码为UTF-8或者已经把字符转为UTF-8)使用json_encode将PHP中的array数组转为JSON字符串。例如:

<?php 
 $testJSON=array('name'=>'中文字符串','value'=>'test'); 
 echo json_encode($testJSON); 
?>

查看输出结果为:

{“name”:”\u4e2d\u6587\u5b57\u7b26\u4e32″,”value”:”test”}

可见即使用UTF8编码的字符,使用json_encode也出现了中文乱码。解决办法是在使用json_encode之前把字符用函数urlencode()处理一下,然后再json_encode,输出结果的时候在用函数urldecode()转回来。具体如下:

<?php 
 $testJSON=array('name'=>'中文字符串','value'=>'test'); 
 //echo json_encode($testJSON); 
 foreach ( $testJSON as $key => $value ) { 
  $testJSON[$key] = urlencode ( $value ); 
 } 
 echo urldecode ( json_encode ( $testJSON ) ); 
?>

查看输出结果为:

{“name”:”中文字符串”,”value”:”test”}

到此,成功地输出了中文字符。随意使用json_encode吧。这样子在PHP后台输出的JSON字符串在前台javascript中Ajax接收后eval出来也不会出现中文乱码,因为js在处理JSON格式数据是也是以UTF8的形式进行的,与PHP类似,故接收PHP页面的JSON字符串不会出现问题。

PHP 相关文章推荐
PHP&amp;MYSQL服务器配置说明
Oct 09 PHP
PHP 页面编码声明方法详解(header或meta)
Mar 12 PHP
php用正则表达式匹配中文实例详解
Nov 06 PHP
php简单判断文本编码的方法
Jul 30 PHP
无需数据库在线投票调查php代码
Jul 20 PHP
CentOS 7.2 下编译安装PHP7.0.10+MySQL5.7.14+Nginx1.10.1的方法详解(mini版本)
Sep 01 PHP
php实现的SSO单点登录系统接入功能示例分析
Oct 12 PHP
php正则去除网页中所有的html,js,css,注释的实现方法
Nov 03 PHP
Nginx下ThinkPHP5的配置方法详解
Aug 01 PHP
php获取ajax的headers方法与内容实例
Dec 27 PHP
Laravel Validator 实现两个或多个字段联合索引唯一
May 08 PHP
浅谈laravel aliases别名的原理
Oct 24 PHP
PHP explode()函数的几个应用和implode()函数有什么区别
Nov 05 #PHP
双冒号 ::在PHP中的使用情况
Nov 05 #PHP
php根据用户语言跳转相应网页
Nov 04 #PHP
非常全面的php日期时间运算汇总
Nov 04 #PHP
php对文件夹进行相关操作(遍历、计算大小)
Nov 04 #PHP
PHP实现HTML页面静态化的方法
Nov 04 #PHP
php实现网站留言板功能
Nov 04 #PHP
You might like
PHP登陆后跳转到登陆前页面实现思路及代码
2014/01/17 PHP
windows7下php开发环境搭建图文教程
2015/01/06 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
2020/03/23 PHP
jquery animate 动画效果使用说明
2009/11/04 Javascript
JavaScript Event事件学习第一章 Event介绍
2010/02/07 Javascript
jQuery获取样式中的背景颜色属性值/颜色值
2012/12/17 Javascript
深入探讨JavaScript、JQuery屏蔽网页鼠标右键菜单及禁止选择复制
2014/06/10 Javascript
如何用javascript计算文本框还能输入多少个字符
2015/07/29 Javascript
JavaScript知识点总结(十一)之js中的Object类详解
2016/05/31 Javascript
全面了解javascript三元运算符
2016/06/27 Javascript
JS拉起或下载app的实现代码
2017/02/22 Javascript
微信小程序实现多个按钮toggle功能的实例
2017/06/13 Javascript
Vue.js实现数据响应的方法
2018/08/13 Javascript
vuex + axios 做登录验证 并且保存登录状态的实例
2018/09/16 Javascript
react native 原生模块桥接的简单说明小结
2019/02/26 Javascript
使用异步组件优化Vue应用程序的性能
2019/04/28 Javascript
解决vue prop传值default属性如何使用,为何不生效的问题
2020/09/21 Javascript
springboot+vue+对接支付宝接口+二维码扫描支付功能(沙箱环境)
2020/10/15 Javascript
vue3.0 加载json的方法(非ajax)
2020/10/26 Javascript
[02:44]2014DOTA2 国际邀请赛中国区预选赛 大神红毯秀
2014/05/25 DOTA
[01:46]2018完美盛典章节片——坚守
2018/12/17 DOTA
[55:44]OG vs NAVI 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
python实现堆栈与队列的方法
2015/01/15 Python
Python中最大最小赋值小技巧(分享)
2017/12/23 Python
Python下使用Scrapy爬取网页内容的实例
2018/05/21 Python
TensorFlow车牌识别完整版代码(含车牌数据集)
2019/08/05 Python
Python 异步协程函数原理及实例详解
2019/11/13 Python
python实现打砖块游戏
2020/02/25 Python
Selenium常见异常解析及解决方案示范
2020/04/10 Python
Sneaker Studio匈牙利:购买运动鞋
2018/03/26 全球购物
如何现实servlet的单线程模式
2014/08/05 面试题
大学生校园创业计划书
2014/02/08 职场文书
车队司机自我鉴定
2014/03/02 职场文书
学校组织向国旗敬礼活动方案(中小学适用)
2014/09/27 职场文书
法人代表证明书格式
2014/10/01 职场文书
8g内存用python读取10文件_面试题-python 如何读取一个大于 10G 的txt文件?
2021/05/28 Python