免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1677 | 回复: 0
打印 上一主题 下一主题

php处理json时中文问题的解决 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-04-12 12:08 |只看该作者 |倒序浏览
php处理json时中文问题的解决


最近在项目里面用到json操作,之前测试都是很正常的,不过今天在把对象转换成json的时候,其中有个中文属性变成了null.

操作的代码如下:
  1. 1 <?php
  2. 2 $usr = new User();
  3. 3 echo json_encode($usr);
复制代码
4 ?>很简单的代码,无中文情况一切正常,输出如下:
  1. {"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上看到别人的函数如下:

  1. 1 private function to_utf8($in)
  2. 2     {
  3. 3         if (is_array($in)) {
  4. 4             foreach ($in as $key => $value)
  5. 5             {
  6. 6                 $out[$this->to_utf8($key)] = $this->to_utf8($value);
  7. 7             }
  8. 8         }
  9. 9         elseif(is_string($in))
  10. 10         {
  11. 11             if(mb_detect_encoding($in) != "UTF-8")
  12. 12                 return utf8_encode($in);
  13. 13             else
  14. 14                 return $in;
  15. 15         }
  16. 16         else
  17. 17         {
  18. 18             return $in;
  19. 19         }
  20. 20         return $out;
  21. 21     }
复制代码
于是拿下来转换编码发现已经不为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的时候,千万不能忘记转换成原先的编码,否则会输出乱码!!
困扰了一天的问题终于搞定了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP