php处理json时中文问题的解决方法


Posted in PHP onApril 12, 2011

操作的代码如下:

<?php 
$usr = new User(); 
echo json_encode($usr); 
?>

很简单的代码,无中文情况一切正常,输出如下:
{"PlatformID":"123213","UserID":"1023"}
一旦有中文的时候会出现两种情况。

第一种情况是对象本身的某个值为中文的属性是utf-8编码,则会有如下输出:

{"PlatformID":"123213","UserID":"1023","UserName":"\u00b7\u00f0\u00b5\u00b2\u00c9\u00b1\u00b7\u00f0\u00cc\u00fc"}
其中的UserName是非人类语言,这个是正常的,如果我们用firebug看下就是中文的。(这个纠结了我半天)

第二种情况是非utf-8编码,输出会变成null:

{"PlatformID":"123213","UserID":"1023","UserName":null}
很奇怪,查了手册后知道json_encode是只对utf-8有效,其它编码均会变为null.

下面就开始解决编码转化的问题。
在php.net上看到别人的函数如下:

private function to_utf8($in) 
{ 
if (is_array($in)) { 
foreach ($in as $key => $value) 
{ 
$out[$this->to_utf8($key)] = $this->to_utf8($value); 
} 
} 
elseif(is_string($in)) 
{ 
if(mb_detect_encoding($in) != "UTF-8") 
return utf8_encode($in); 
else 
return $in; 
} 
else 
{ 
return $in; 
} 
return $out; 
}

于是拿下来转换编码发现已经不为null.欣喜之下用firebug打开,发现并不是我原来的中文字符....开始纠结......
难道是要让他转换成原来的编码?回去寻找原始编码......
测试开始:

1.把$usr->UserName直接输出,页面头设置charset=utf-8.乱码
2.echo json_encode($usr)输出UserName=null
3.页面头设置为charset=gbk,输出正确->可以确定原编码为gbk
最后通过IE,Chrome,Firefox测试得出结论:

1.保证页面字符集与数据库一致,输出一定正常 。
2.做json_encode时保证数据编码是utf-8,json_decode正常。
3.如果要对非utf-8字符做json_encode,先转换成utf-8。
4.对非utf-8字符做json_decode的时候,千万不能忘记转换成原先的编码,否则会输出乱码!!
困扰了一天的问题终于搞定了。

PHP 相关文章推荐
php中explode与split的区别介绍
Oct 03 PHP
php笔记之:数据类型与常量的使用分析
May 14 PHP
使用gd库实现php服务端图片裁剪和生成缩略图功能分享
Dec 25 PHP
PHP循环输出指定目录下的所有文件和文件夹路径例子(简单实用)
May 10 PHP
推荐几款用 Sublime Text 开发 Laravel 所用到的插件
Oct 30 PHP
php中chdir()函数用法实例
Nov 13 PHP
Laravel5中contracts详解
Mar 02 PHP
PHP实现小偷程序实例
Oct 31 PHP
Laravel中unique和exists验证规则的优化详解
Jan 28 PHP
PHP后台备份MySQL数据库的源码实例
Mar 18 PHP
laravel 实现根据字段不同值做不同查询
Oct 23 PHP
Linux系统下安装PHP7.3版本
Jun 26 PHP
php 面向对象的一个例子
Apr 12 #PHP
深入理解PHP原理之Session Gc的一个小概率Notice
Apr 12 #PHP
php表单提交问题的解决方法
Apr 12 #PHP
使用NetBeans + Xdebug调试PHP程序的方法
Apr 12 #PHP
php产生随机数的两种方法实例代码 输出随机IP
Apr 08 #PHP
PHP随机数生成代码与使用实例分析
Apr 08 #PHP
PHP的cURL库功能简介 抓取网页、POST数据及其他
Apr 07 #PHP
You might like
详谈PHP中public,private,protected,abstract等关键字的用法
2017/12/31 PHP
Yii2框架中一些折磨人的坑
2019/12/15 PHP
javascript Base类 包含基本的方法
2009/07/22 Javascript
JavaScript中String和StringBuffer的速度之争
2010/04/01 Javascript
js特殊字符过滤的示例代码
2014/03/05 Javascript
基于dropdown.js实现的两款美观大气的二级导航菜单
2015/09/02 Javascript
jQuery实现ajax调用WCF服务的方法(附带demo下载)
2015/12/04 Javascript
微信小程序开发之实现选项卡(窗口顶部TabBar)页面切换
2016/11/25 Javascript
jQuery窗口拖动功能的实现代码
2017/02/04 Javascript
JavaScrpt的面向对象全面解析
2017/05/09 Javascript
vue-cli构建项目使用 less的方法
2017/10/04 Javascript
解决vue多个路由共用一个页面的问题
2018/03/12 Javascript
如何用webpack4带你实现一个vue的打包的项目
2018/06/20 Javascript
深入理解JavaScript 中的匿名函数((function() {})();)与变量的作用域
2018/08/28 Javascript
详解小程序如何改变onLoad的执行时机
2019/11/01 Javascript
vue中js判断长时间不操作界面自动退出登录(推荐)
2020/01/22 Javascript
关于angular 8.1使用过程中的一些记录
2020/11/25 Javascript
python基于xml parse实现解析cdatasection数据
2014/09/30 Python
Python基于分水岭算法解决走迷宫游戏示例
2017/09/26 Python
详解Python判定IP地址合法性的三种方法
2018/03/06 Python
Python 多线程不加锁分块读取文件的方法
2018/12/11 Python
Python3加密解密库Crypto的RSA加解密和签名/验签实现方法实例
2020/02/11 Python
CSS3实现简易版的刮刮乐效果
2016/09/27 HTML / CSS
销售总监工作职责
2013/11/21 职场文书
专科毕业生自我鉴定
2013/12/01 职场文书
如何打造一封优秀的留学推荐信
2014/01/25 职场文书
体育课课后反思
2014/04/24 职场文书
2014年三万活动总结
2014/04/26 职场文书
大班幼儿评语大全
2014/04/30 职场文书
2014年超市工作总结
2014/11/19 职场文书
机关单位工作失职检讨书
2014/11/20 职场文书
违反纪律检讨书范文
2015/05/07 职场文书
病房管理制度范本
2015/08/06 职场文书
《最后一头战象》教学反思
2016/02/16 职场文书
如何在Python项目中引入日志
2021/05/31 Python
MySQL数据库配置信息查看与修改方法详解
2022/06/25 MySQL