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 相关文章推荐
风格模板初级不完全修改教程
Oct 09 PHP
剖析 PHP 中的输出缓冲
Dec 21 PHP
DEDE采集大师官方留后门的删除办法
Jan 08 PHP
Yii使用find findAll查找出指定字段的实现方法
Sep 05 PHP
分享常见的几种页面静态化的方法
Jan 08 PHP
WordPress中邮件的一些修改和自定义技巧
Dec 15 PHP
php获得客户端浏览器名称及版本的方法(基于ECShop函数)
Dec 23 PHP
100多行PHP代码实现socks5代理服务器[2]
May 05 PHP
thinkPHP线上自动加载异常与修复方法实例分析
Dec 01 PHP
PHP计算近1年的所有月份
Mar 13 PHP
php PDO实现的事务回滚示例
Mar 23 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
Dec 21 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
PHPAnalysis中文分词类详解
2014/06/13 PHP
四种php中webservice实现的简单架构方法及实例
2015/02/03 PHP
thinkPHP框架实现的短信接口验证码功能示例
2018/06/20 PHP
浅谈PHPANALYSIS提取关键字
2019/03/08 PHP
java解析json方法总结
2019/05/16 PHP
解决PHP curl或file_get_contents下载图片损坏或无法打开的问题
2019/10/11 PHP
初窥JQuery-Jquery简介 入门了解篇
2010/11/25 Javascript
基于jquery中children()与find()的区别介绍
2013/04/26 Javascript
js模仿jquery的写法示例代码
2013/06/16 Javascript
jQuery制作的别致导航有阴影背景高亮模式窗口
2014/04/15 Javascript
JavaScript的作用域和块级作用域概念理解
2014/09/21 Javascript
Javascript检查图片大小不要让大图片撑破页面
2014/11/04 Javascript
深入浅析JavaScript面向对象和原型函数
2016/02/06 Javascript
Ext JS框架程序中阻止键盘触发回退或者刷新页面的代码分享
2016/06/07 Javascript
Jquery Easyui选项卡组件Tab使用详解(10)
2016/12/18 Javascript
jQuery电话号码验证实例
2017/01/05 Javascript
Bootstrap4 gulp 配置详解
2019/01/06 Javascript
面试题:react和vue的区别分析
2019/04/08 Javascript
Angular中使用ng-zorro图标库部分图标不能正常显示问题
2019/04/22 Javascript
JS实现随机抽取三人
2019/11/06 Javascript
[36:45]TNC vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
ssh批量登录并执行命令的python实现代码
2012/05/25 Python
python生成器的使用方法
2013/11/21 Python
使用tensorboard可视化loss和acc的实例
2020/01/21 Python
如何使用Python抓取网页tag操作
2020/02/14 Python
python爬虫开发之PyQuery模块详细使用方法与实例全解
2020/03/09 Python
Keras搭建自编码器操作
2020/07/03 Python
python 下划线的不同用法
2020/10/24 Python
python批量合成bilibili的m4s缓存文件为MP4格式 ver2.5
2020/12/01 Python
校园安全教育广播稿
2014/02/17 职场文书
市场营销专业毕业生求职信
2014/07/21 职场文书
有子女的离婚协议书怎么写(范本)
2014/09/29 职场文书
2014年后勤工作总结
2014/11/18 职场文书
正规借条模板
2015/05/26 职场文书
公司员工培训管理制度
2015/08/04 职场文书
Javascript中async与await的捕捉错误详解
2022/03/03 Javascript