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 相关文章推荐
substr()函数中文版
Oct 09 PHP
php新建文件自动编号的思路与实现
Jun 27 PHP
Linux下CoreSeek及PHP扩展模块的安装
Sep 23 PHP
PHP+memcache实现消息队列案例分享
May 21 PHP
Linux下安装PHP MSSQL扩展教程
Oct 24 PHP
php检索或者复制远程文件的方法
Mar 13 PHP
win7系统配置php+Apache+mysql环境的方法
Aug 21 PHP
php提高网站效率的技巧
Sep 29 PHP
Symfony2实现在doctrine中内置数据的方法
Feb 05 PHP
php使用FFmpeg接口获取视频的播放时长、码率、缩略图以及创建时间
Nov 07 PHP
laravel 字段格式化 modle 字段类型转换方法
Sep 30 PHP
Laravel实现ORM带条件搜索分页
Oct 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程序实现支持页面后退的两种方法
2008/06/30 PHP
php实现事件监听与触发的方法
2014/11/21 PHP
typecho插件编写教程(四):插件挂载
2015/05/28 PHP
PHP函数nl2br()与自定义函数nl2p()换行用法分析
2016/04/02 PHP
PHP与SQL语句常用大全
2016/12/10 PHP
tp5.1 框架数据库常见操作详解【添加、删除、更新、查询】
2020/05/26 PHP
TP5多入口设置实例讲解
2020/12/15 PHP
window.addEventListener来解决让一个js事件执行多个函数
2012/12/26 Javascript
jquery在项目中做复选框时遇到的一些问题笔记
2013/11/17 Javascript
深入理解JavaScript高级之词法作用域和作用域链
2013/12/10 Javascript
jQuery之字体大小的设置方法
2014/02/27 Javascript
Visual Studio中js调试的方法图解
2014/06/30 Javascript
借助JavaScript脚本判断浏览器Flash Player信息的方法
2014/07/09 Javascript
关于jQuery判断元素是否存在的问题示例探讨
2014/07/21 Javascript
node.js中的buffer.slice方法使用说明
2014/12/10 Javascript
js判断文本框剩余可输入字数的方法
2015/02/04 Javascript
JS实现霓虹灯文字效果的方法
2015/08/06 Javascript
jQuery实现的淡入淡出二级菜单效果代码
2015/09/15 Javascript
浅析Javascript中bind()方法的使用与实现
2016/05/30 Javascript
EasyUI布局 高度自适应
2016/06/04 Javascript
nodejs前端自动化构建环境的搭建
2017/07/26 NodeJs
详解JS中的this、apply、call、bind(经典面试题)
2017/09/19 Javascript
js点击时关闭该范围下拉菜单之外的菜单方法
2018/01/11 Javascript
浅谈Koa2框架利用CORS完成跨域ajax请求
2018/03/06 Javascript
简述pm2常用命令集合及配置文件说明
2019/05/30 Javascript
利用JavaScript将Excel转换为JSON示例代码
2019/06/14 Javascript
JavaScript console的使用方法实例分析
2020/04/28 Javascript
vue-video-player视频播放器使用配置详解
2020/10/23 Javascript
Electron+vue从零开始打造一个本地播放器的方法示例
2020/10/27 Javascript
Linux下Python安装完成后使用pip命令的详细教程
2018/11/22 Python
浅谈Html5多线程开发之WebWorkers
2018/05/02 HTML / CSS
全球最大的户外用品零售商之一:The House
2018/06/12 全球购物
最新自我评价范文
2013/11/16 职场文书
《陋室铭》教学反思
2014/02/26 职场文书
党员教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
2016年国庆节假期旅游工作总结
2016/04/01 职场文书