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 25 PHP
PHP写入WRITE编码为UTF8的文件的实现代码
Jul 07 PHP
PHP 登录记住密码实现思路
May 07 PHP
基于php下载文件的详解
Jun 02 PHP
VIM中设置php自动缩进为4个空格的方法详解
Jun 14 PHP
php实现上传图片生成缩略图示例
Apr 13 PHP
php下载文件源代码(强制任意文件格式下载)
May 09 PHP
最准确的php截取字符串长度函数
Oct 29 PHP
PHP Oauth授权和本地加密实现方法
Aug 12 PHP
php 遍历目录,生成目录下每个文件的md5值并写入到结果文件中
Dec 12 PHP
如何通过View::first使用Laravel Blade的动态模板详解
Sep 21 PHP
PHP PDOStatement::closeCursor讲解
Jan 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
php preg_replace替换实例讲解
2013/11/04 PHP
php读取文件内容的三种可行方法示例介绍
2014/02/08 PHP
PHP实现支付宝即时到账功能
2016/12/21 PHP
PHP编程实现脚本异步执行的方法
2017/08/09 PHP
script不刷新页面的联动前后代码
2013/09/18 Javascript
判断客户浏览器是否支持cookie的示例代码
2013/12/23 Javascript
js使用eval解析json实例与注意事项分享
2014/01/18 Javascript
JS实现动态移动层及拖动浮层关闭的方法
2015/04/30 Javascript
jQuery ajax时间差导致的变量赋值问题分析
2016/01/22 Javascript
Treegrid的动态加载实例代码
2016/04/29 Javascript
Ajax异步获取html数据中包含js方法无效的解决方法
2017/02/20 Javascript
解决JSON.stringify()自动将中文转译成unicode的问题
2018/01/05 Javascript
使用ECharts实现状态区间图
2018/10/25 Javascript
vue如何根据网站路由判断页面主题色详解
2018/11/02 Javascript
TypeScript的安装、使用、自动编译的实现
2020/04/10 Javascript
python pdb调试方法分享
2014/01/21 Python
Python自动调用IE打开某个网站的方法
2015/06/03 Python
python实现爬取千万淘宝商品的方法
2015/06/30 Python
简单讲解Python中的字符串与字符串的输入输出
2016/03/13 Python
Python爬虫抓取代理IP并检验可用性的实例
2018/05/07 Python
基于scrapy的redis安装和配置方法
2018/06/13 Python
python3+selenium自动化测试框架详解
2019/03/17 Python
Python直接赋值、浅拷贝与深度拷贝实例分析
2019/06/18 Python
python装饰器常见使用方法分析
2019/06/26 Python
python 爬虫百度地图的信息界面的实现方法
2019/10/27 Python
浅谈Html5中视频 音频标签 进度条的问题
2016/07/26 HTML / CSS
阿迪达斯比利时官方商城:adidas比利时
2016/10/10 全球购物
澳大利亚音乐商店:Bava’s Music City
2019/05/05 全球购物
Python中如何定义一个函数
2016/09/06 面试题
医院实习介绍信
2014/01/12 职场文书
旅游管理毕业生自荐信范文
2014/03/19 职场文书
幼儿园的门卫岗位职责
2014/04/10 职场文书
高三学生评语大全
2014/04/25 职场文书
新农村建设汇报材料
2014/08/15 职场文书
公司周年庆寄语
2019/06/21 职场文书
SQL Server基本使用和简单的CRUD操作
2021/04/05 SQL Server