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文本操作类
Nov 25 PHP
在PHP中设置、使用、删除Cookie的解决方法
May 06 PHP
深入eAccelerator与memcached的区别详解
Jun 06 PHP
Php无限级栏目分类读取的实现代码
Feb 19 PHP
php目录操作实例代码
Feb 21 PHP
PHP中使用smarty生成静态文件的例子
Apr 24 PHP
php身份证号码检查类实例
Jun 18 PHP
thinkphp整合微信支付代码分享
Nov 24 PHP
PHP聊天室简单实现方法详解
Dec 08 PHP
php微信扫码支付 php公众号支付
Mar 24 PHP
PHP代码覆盖率统计详解
Jul 22 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自动生成后台导航网址的最佳方法
2013/08/27 PHP
php获取域名的google收录示例
2014/03/24 PHP
修改ThinkPHP缓存为Memcache的方法
2014/06/25 PHP
php随机抽奖实例分析
2015/03/04 PHP
php使用mysqli和pdo扩展,测试对比mysql数据库的执行效率完整示例
2019/05/09 PHP
Javascript模块模式分析
2008/05/16 Javascript
Javascript insertAfter() 实现函数代码
2011/10/12 Javascript
javascript实现的图片切割多块效果实例
2015/05/07 Javascript
初步认识JavaScript函数库jQuery
2015/06/18 Javascript
值得分享的Bootstrap Ace模板实现菜单和Tab页效果
2015/12/30 Javascript
Javascript缓存API
2016/06/14 Javascript
JS之获取样式的简单实现方法(推荐)
2016/09/13 Javascript
JavaScript中值类型和引用类型的区别
2017/02/23 Javascript
vue-router之实现导航切换过渡动画效果
2019/10/31 Javascript
[59:08]Ti4 冒泡赛第二天 NEWBEE vs Titan 2
2014/07/15 DOTA
教你用Python脚本快速为iOS10生成图标和截屏
2016/09/22 Python
python函数的5种参数详解
2017/02/24 Python
Django中ORM表的创建和增删改查方法示例
2017/11/15 Python
检测python爬虫时是否代理ip伪装成功的方法
2019/07/12 Python
python自动化工具之pywinauto实例详解
2019/08/26 Python
python turtle 绘制太极图的实例
2019/12/18 Python
ansible动态Inventory主机清单配置遇到的坑
2020/01/19 Python
Pytho爬虫中Requests设置请求头Headers的方法
2020/09/22 Python
python中count函数知识点浅析
2020/12/17 Python
使用CSS3的背景渐变Text Gradient 创建文字颜色渐变
2014/08/19 HTML / CSS
国际奢侈品品牌童装购物网站:Designer Childrenswear
2019/05/08 全球购物
日本最大化妆品和美容产品的综合口碑网站:cosme shopping
2019/08/28 全球购物
linux面试题参考答案(6)
2014/08/29 面试题
船舶专业个人求职信范文
2014/01/02 职场文书
化工专业大学生职业生涯规划书
2014/01/14 职场文书
员工考核管理制度
2014/02/02 职场文书
逃课上网检讨书
2014/02/20 职场文书
2014房屋登记授权委托书
2014/10/13 职场文书
2015年全国助残日活动方案
2015/05/04 职场文书
Mysql中调试存储过程最简单的方法
2021/06/30 MySQL
Python使用mitmproxy工具监控手机 下载手机小视频
2022/04/18 Python