php处理json时中文问题的解决方法

操作的代码如下:

复制代码 代码如下:

<?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+mysqli预处理技术实现添加、修改及删除多条数据的方法。分享给大家供大家参考。具体分析如下: 首先来说说为什么要有预处理(预编译)技术?举个例子:假设要向数据库添加100个用户,按常规思路,就是向数据库发送100个执行请求,此时,按照 mysql 数据库的工作原理,它需要对每一条执行语句进行编译(这里就有100次)。所以,这里的效率是非常低的。 预处理(预编译)技术的作用,就是减少编译的次数和时间,以提高效果。通过一个案例来说明,预处理(预编译)技术是如何做到的(好吧,先说清楚,当

php绘制一个扇形的方法 - 2015-04-11 14:04:11

本文实例讲述了php绘制一个扇形的方法。分享给大家供大家参考。具体如下: php绘制一个扇形。关于参数说明,除最后一个参数外,其它都与弧线的参数一样,请参考上一篇《 php绘制一条弧线的方法 》。最后一个参数有四种类型。分别是: IMG_ARC_PIE、IMG_ARC_CHORD、IMG_ARC_NOFILL和IMG_ARC_EDGED,具体参数说明见php手册的 imagefilledarc 画扇形函数。 复制代码 代码如下: ?php //1、创建画布 $im = imagecreatetruecol
自 PHP 5 起,可以很容易地通过在 $value 之前加上 来修改数组的元素。此方法将以引用赋值而不是拷贝一个值。 复制代码 代码如下: ?php $arr = array(1, 2, 3, 4); foreach ($arr as $value) { $value = $value * 2; } // $arr is now array(2, 4, 6, 8) ? 此方法仅在被遍历的数组可以被引用时才可用(例如是个变量)。 复制代码 代码如下: ?php foreach (array(1, 2, 3,
网站质量不错的网站可以在百度站长平台/数据提交/sitemap栏目下看到实时推送的功能, 目前这个工具是邀请开放, 百度的实时推送的api接口可以实时推送我们新发布的文章, 保证百度在第一时间收录. 百度站长平台 http://zhanzhang.baidu.com/ 打开百度站长平台, 点开实时推送的添加新数据接口获得带token的api推送地址: http://ping.baidu.com/sitemap?site=www.yourdomain.comresource_name=sitemapacce
本文实例讲述了php使用正则表达式获取图片url的方法。分享给大家供大家参考。 具体实现方法如下: 复制代码 代码如下: ?php header("Content-type:text/html;charset=utf-8"); $str = 'pimg src="images/11111111.jpg" alt="美女" //p'; $pattern = "/[img|IMG].*?src=['|\"](.*?(?:[.gif|.jpg]))['|\"].*?[\/]?/"; preg_match_all

深入理解php的MySQL连接类 - 2015-04-11 14:04:10

无意间在电脑里发现还有这么个Mysql的连接类,也不记得哪里收藏的了,贴上来吧。 后面几个show_databases和show_tables....等方法都用了一堆echo,好像一直不喜欢在类的方法里直接用输出语句,不过这也只是列举数据库和表名,构造函数的参数也可以给个默认值吧。 复制代码 代码如下: ?php /* * filename:mysql数据库连接类 */ class mysql{ private $db_host; //数据库主机 private $db_user; //数据库用户名 pri
复制代码 代码如下: ?php function getIPLoc_sina($queryIP){ $url = 'http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=jsonip='.$queryIP; $ch = curl_init($url); curl_setopt($ch,CURLOPT_ENCODING ,'utf8'); curl_setopt($ch, CURLOPT_TIMEOUT, 5); curl_setopt($ch,
1.php版本简介 php各版本之间的区别,php版本后面一般有VC6和VC9、Thread Safe和Non Thread Safe的区别,VC6就是legacy Visual Studio 6 compiler,就 是使用这个编译器编译的,VC9就是the Visual Studio 2008 compiler,就是用微软的VS编辑器编译的,如果你选用的是Apache或者其他服务软 件,那么选择VC6,选用的是IIS的话,那么请下载VC9 的。Thread Safe 是线程安全,而Non Thread

destoon整合UCenter图文教程 - 2015-04-11 14:04:09

1、首先登录UCenter管理中心 添加应用 2、填写完毕后,点提交,将页面滚动至底部 复制其中的Ucenter配置信息至记事本 注意图中的 数据表前缀 和 API地址 80%以上的整合失败是因为这两个参数填写错误导致的 3、进入Destoon管理后台 - 会员管理 - 模块设置 - 会员整合 填写相关参数 提交即可整合成功 通常情况下UC提示通信成功可能不等于整合成功 如果DZ里登陆退出不能和Destoon同步,可能是DZ跳转过快导致,可按下图调整跳转时间
php地址栏传中文$_GET下来后乱码,urlencode和urldecode用法详解 url编码 语法: string urlencode(string str); 返回值: 字符串 函数种类: 编码处理 例如: 复制代码 代码如下: ?php $ChineseName="我的名字,是中文的哦"; $EncodeStr=urlencode($ChineseName); echo "a href=#>? url解码 还原 URL 编码字符串。 语法: string urldecode(string str