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 相关文章推荐
?繁体转换的class
Oct 09 PHP
PHP新手上路(七)
Oct 09 PHP
php编程实现获取excel文档内容的代码实例
Jun 28 PHP
PHP学习笔记 IIS7下安装配置php环境
Oct 29 PHP
PHP中使用break跳出多重循环代码实例
Jan 21 PHP
PHP中使用Imagick实现各种图片效果实例
Jan 21 PHP
php使用NumberFormatter格式化货币的方法
Mar 21 PHP
PHP 表单提交及处理表单数据详解及实例
Dec 27 PHP
解析 thinkphp 框架中的部分方法
May 07 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
Jul 20 PHP
PHP新特性之字节码缓存和内置服务器
Aug 11 PHP
PHP的PDO事务与自动提交
Jan 24 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 8小时时间差的解决方法小结
2009/12/22 PHP
解析php5配置使用pdo
2013/07/03 PHP
php中try catch捕获异常实例详解
2014/11/21 PHP
php技巧小结【推荐】
2017/01/19 PHP
ThinkPHP框架分布式数据库连接方法详解
2017/03/14 PHP
调试php程序的简单步骤
2019/10/04 PHP
js操作cookie保存浏览记录的方法
2015/12/25 Javascript
JavaScript深度复制(deep clone)的实现方法
2016/02/19 Javascript
JS中多步骤多分步的StepJump组件实例详解
2016/04/01 Javascript
AngularJS 避繁就简的路由
2016/07/01 Javascript
ionic由于使用了header和subheader导致被遮挡的问题的两种解决方法
2016/09/22 Javascript
jQuery 常见小例汇总
2016/12/14 Javascript
JS实现动态添加DOM节点和事件的方法示例
2017/04/28 Javascript
vue移动端路由切换实例分析
2018/05/14 Javascript
如何从头实现一个node.js的koa框架
2019/06/17 Javascript
vue动态加载SVG文件并修改节点数据的操作代码
2020/08/17 Javascript
[00:49]完美世界DOTA2联赛10月28日开团时刻:随便打
2020/10/29 DOTA
Python datetime时间格式化去掉前导0
2014/07/31 Python
谈谈如何手动释放Python的内存
2016/12/17 Python
Python中的函数式编程:不可变的数据结构
2018/10/08 Python
Python实现字符型图片验证码识别完整过程详解
2019/05/10 Python
Python使用进程Process模块管理资源
2020/03/05 Python
Python识别验证码的实现示例
2020/09/30 Python
英国二手物品交易网站:Preloved
2017/10/06 全球购物
运动鞋、街头服装、手表和手袋的实时市场:StockX
2020/11/25 全球购物
C语言面试题
2015/10/30 面试题
公司培训欢迎词
2014/01/10 职场文书
2014年“四风”问题个人整改措施
2014/09/17 职场文书
2015年党员承诺书
2015/01/21 职场文书
助学感谢信范文
2015/01/21 职场文书
物流业务员岗位职责
2015/04/03 职场文书
2019年销售人员的职业生涯规划书
2019/03/25 职场文书
Oracle 区块链表创建过程详解
2021/05/15 Oracle
用python画城市轮播地图
2021/05/28 Python
MySQL的安装与配置详细教程
2021/06/26 MySQL
python代码实现扫码关注公众号登录的实战
2021/11/01 Python