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的面试题集,附我的答案和分析(一)
Nov 19 PHP
php下mysql数据库操作类(改自discuz)
Jul 03 PHP
Uncaught exception com_exception with message Failed to create COM object
Jan 11 PHP
php计算指定目录下文件占用空间的方法
Mar 13 PHP
PHP汉字转换拼音的函数代码
Dec 30 PHP
php使用escapeshellarg时中文被过滤的解决方法
Jul 10 PHP
PHP自定义图片缩放函数实现等比例不失真缩放的方法
Aug 19 PHP
PHP接口继承及接口多继承原理与实现方法详解
Oct 18 PHP
thinkPHP框架中执行事务的方法示例
May 31 PHP
PHP htmlspecialchars_decode()函数用法讲解
Mar 01 PHP
Centos7安装swoole扩展操作示例
Mar 26 PHP
PHP 判断字符串是中文还是英文, 或者是中英混合
Mar 09 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中文件上传的安全问题
2006/10/09 PHP
php 保留小数点
2009/04/21 PHP
PHP程序开发范例学习之表单 获取文本框的值
2011/08/08 PHP
php 启动报错如何解决
2014/01/17 PHP
php中使用gd库实现远程图片下载实例
2015/05/12 PHP
关于laravel框架中的常用目录路径函数
2019/10/23 PHP
slice函数的用法 之不错的应用
2006/12/29 Javascript
突发奇想的一个jquery插件
2010/11/19 Javascript
深入理解Javascript中的循环优化
2013/11/09 Javascript
JS中FRAME的操作问题实例分析
2014/10/21 Javascript
如何使用jquery实现文字上下滚动效果
2016/10/12 Javascript
详解如何提高 webpack 构建 Vue 项目的速度
2017/07/03 Javascript
使用ECharts实现状态区间图
2018/10/25 Javascript
微信小程序动画(Animation)的实现及执行步骤
2018/10/28 Javascript
vue多页面项目中路由使用history模式的方法
2019/09/23 Javascript
在vue-cli3.0 中使用预处理器 (Sass/Less/Stylus) 配置全局变量操作
2020/08/10 Javascript
Webpack的Loader和Plugin的区别
2020/11/09 Javascript
[01:09:50]VP vs Pain 2018国际邀请赛小组赛BO2 第二场
2018/08/20 DOTA
[01:04:31]DOTA2-DPC中国联赛定级赛 iG vs Magma BO3第二场 1月8日
2021/03/11 DOTA
动态创建类实例代码
2009/10/07 Python
python广度优先搜索得到两点间最短路径
2019/01/17 Python
Python基础知识点 初识Python.md
2019/05/14 Python
python实现控制COM口的示例
2019/07/03 Python
10分钟用python搭建一个超好用的CMDB系统
2019/07/17 Python
如何基于matlab相机标定导出xml文件
2020/11/02 Python
CSS3制作精致的照片墙特效
2016/06/07 HTML / CSS
使用Html5、CSS实现文字阴影效果
2018/01/17 HTML / CSS
迪士尼西班牙官方网上商店:ShopDisney西班牙
2020/02/02 全球购物
函授本科毕业生自我鉴定
2013/10/16 职场文书
毕业生物理教师求职信
2013/10/17 职场文书
大学生家政服务项目创业计划书
2014/01/30 职场文书
《欢乐的泼水节》教学反思
2014/04/22 职场文书
2014年社会实践活动总结范文
2014/04/29 职场文书
新闻工作者先进事迹
2014/05/26 职场文书
社区领导班子四风问题原因分析及整改措施
2014/09/28 职场文书
高效笔记技巧分享:学会这些让你不再困扰
2019/09/04 职场文书