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配置文件中最常用四个ini函数
Mar 19 PHP
php面向对象全攻略 (八)重载新的方法
Sep 30 PHP
PHP 身份验证方面的函数
Oct 11 PHP
PHP 魔术函数使用说明
May 14 PHP
在WINDOWS中设置计划任务执行PHP文件的方法
Dec 19 PHP
Smarty foreach控制循环次数的实现详解
Jul 03 PHP
解决PHP mysql_query执行超时(Fatal error: Maximum execution time …)
Jul 03 PHP
分享一段php获取linux服务器状态的代码
May 27 PHP
用php来限制每个ip每天浏览页面数量的实现思路
Feb 24 PHP
PHP中使用socket方式GET、POST数据实例
Apr 02 PHP
百度工程师讲PHP函数的实现原理及性能分析(一)
May 13 PHP
Laravel 已登陆用户再次查看登陆页面的自动跳转设置方法
Sep 30 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
substr()函数中文版
2006/10/09 PHP
Yii框架参数化查询中IN查询只能查询一个的解决方法
2017/05/20 PHP
PHP CURL中传递cookie的方法步骤
2019/05/09 PHP
php array 转json及java 转换 json数据格式操作示例
2019/11/13 PHP
图片按比例缩放函数
2006/06/26 Javascript
Prototype使用指南之dom.js
2007/01/10 Javascript
html中table数据排序的js代码
2011/08/09 Javascript
关于JS控制代码暂停的实现方法分享
2012/10/11 Javascript
JS完成代码前最好对其做5件事
2013/04/07 Javascript
jquery动态添加删除div 具体实现
2013/07/20 Javascript
用Jquery.load载入页面实现局部刷新
2014/01/22 Javascript
jquery对象和DOM对象的任意相互转换
2016/02/21 Javascript
webix+springmvc session超时跳转登录页面
2016/10/30 Javascript
详解angularJs中自定义directive的数据交互
2017/01/13 Javascript
ECMAScript6--解构
2017/03/30 Javascript
xmlplus组件设计系列之路由(ViewStack)(7)
2017/05/02 Javascript
angularjs中ng-bind-html的用法总结
2017/05/23 Javascript
node.js爬取中关村的在线电瓶车信息
2018/11/13 Javascript
JavaScript实现的弹出遮罩层特效经典示例【基于jQuery】
2019/07/10 jQuery
使用PYTHON接收多播数据的代码
2012/03/01 Python
在Python的Django框架中实现Hacker News的一些功能
2015/04/17 Python
Python黑魔法Descriptor描述符的实例解析
2016/06/02 Python
Python爬虫之xlml解析库(全面了解)
2017/08/08 Python
python爬虫之BeautifulSoup 使用select方法详解
2017/10/23 Python
Python使用matplotlib实现绘制自定义图形功能示例
2018/01/18 Python
批量将ppt转换为pdf的Python代码 只要27行!
2018/02/26 Python
python sys.argv[]用法实例详解
2018/05/25 Python
Python使用matplotlib和pandas实现的画图操作【经典示例】
2018/06/13 Python
python实现图片插入文字
2019/11/26 Python
Pycharm中切换pytorch的环境和配置的教程详解
2020/03/13 Python
高一新生军训感言
2014/03/02 职场文书
社区健康教育实施方案
2014/03/18 职场文书
完美的中文自荐信
2014/05/24 职场文书
水污染治理工程专业自荐信
2014/06/21 职场文书
党员教师个人对照检查材料范文
2014/09/25 职场文书
2014年班主任德育工作总结
2014/12/05 职场文书