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 相关文章推荐
Discuz!5的PHP代码高亮显示插件(黑暗中的舞者更新)
Jan 29 PHP
dedecms后台验证码总提示错误的解决方法
Mar 21 PHP
Windows 下的 PHP-PEAR 安装方法
Nov 20 PHP
QQ登录 PHP OAuth示例代码
Jul 20 PHP
php正则表达匹配中文问题分析小结
Mar 25 PHP
php生成略缩图代码
Jul 16 PHP
在yii中新增一个用户验证的方法详解
Jun 20 PHP
使用HMAC-SHA1签名方法详解
Jun 26 PHP
php实现阿拉伯数字和罗马数字相互转换的方法
Apr 17 PHP
Symfony2学习笔记之插件格式分析
Mar 17 PHP
php 解决substr()截取中文字符乱码问题
Jul 18 PHP
TP5框架实现签到功能的方法分析
Apr 05 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函数(简单整理)
2010/04/30 PHP
PHP 将逗号、空格、回车分隔的字符串转换为数组的函数
2012/06/07 PHP
zf框架的Filter过滤器使用示例
2014/03/13 PHP
CI框架实现优化文件上传及多文件上传的方法
2017/01/04 PHP
PHP批量修改文件名称的方法分析
2017/02/27 PHP
javascript之querySelector和querySelectorAll使用说明
2011/10/09 Javascript
使用js画图之圆、弧、扇形
2015/01/12 Javascript
javascript中动态函数用法实例分析
2015/05/14 Javascript
jQuery实现的精美平滑二级下拉菜单效果代码
2016/03/28 Javascript
jquery实现全选和全不选功能效果的实现代码【推荐】
2016/05/05 Javascript
JavaScript事件详细讲解
2016/06/27 Javascript
JS实现用户注册时获取短信验证码和倒计时功能
2016/10/27 Javascript
jQuery中用on绑定事件时需注意的事项
2017/03/19 Javascript
AngularJS基于MVC的复杂操作实例讲解
2017/12/31 Javascript
vue最简单的前后端交互示例详解
2018/10/11 Javascript
详解Webstorm 下的Angular2.0开发之路(图文)
2018/12/06 Javascript
在vue-cli中引入lodash.js并使用详解
2019/11/13 Javascript
原生JS封装拖动验证滑块的实现代码示例
2020/06/01 Javascript
vue中解决chrome浏览器自动播放音频和MP3语音打包到线上的实现方法
2020/10/09 Javascript
[02:58]献给西雅图的情书_高清
2014/05/29 DOTA
[53:43]VP vs NewBee Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
python BeautifulSoup使用方法详解
2013/11/21 Python
使用Django Form解决表单数据无法动态刷新的两种方法
2017/07/14 Python
Python实现的根据文件名查找数据文件功能示例
2018/05/02 Python
Django自定义模板过滤器和标签的实现方法
2019/08/21 Python
pycharm激活码2020最新分享适用pycharm2020最新版亲测可用
2020/11/22 Python
请编程遍历页面上所有 TextBox 控件并给它赋值为 string.Empty
2015/12/03 面试题
工程造价管理专业大专生求职信
2013/10/06 职场文书
学校教师安全责任书
2014/07/23 职场文书
学习教师法的心得体会
2014/09/03 职场文书
有限公司股东合作协议书
2014/10/29 职场文书
与死神共舞观后感
2015/06/15 职场文书
学会感恩主题班会
2015/08/12 职场文书
2019预备党员转正申请书模板2篇!
2019/08/07 职场文书
永中文档在线转换预览基于nginx配置部署方案
2022/06/10 Servers
vue实现input输入模糊查询的三种方式
2022/08/14 Vue.js