PHP返回JSON数据及中文编码问题的解决方案

PHP返回JSON数据既可以在网页端交互也可以与Android端交互,因此,PHP返回JSON数据相对比较重要。最近在做项目时就是用返回JSON数据来和Android端进行交互的。现总结如下:

1.PHP返回简单的json数据的代码实例:

$array = array('username'=>'博客', 'password'=>'123456',); 
echo json_encode($array); 

把要传递的数据放在一个关联数组中,然后通过json_encode()函数传递到Android端或网页端。

Android端接收json数据的核心代码:

StringBuilder builder = new StringBuilder(); 
HttpGet myget = new HttpGet("http://127.0.0.1/Android/index.php"); 
JSONObject jsonObject = new JSONObject(builder.toString()); 
String re_username = jsonObject.getString("username"); 
String re_password = jsonObject.getString("password"); 

2.从数据库中取多组数据并返回json数据的实例:
        $getmsg = mysql_query("SELECT username,content FROM message ORDER BY id desc",$con);
	$msg = array();
	$i = 0;
	while ($row = mysql_fetch_assoc($getmsg))
	{
		$msg[$i] = $row;
		$i++;
	}
        print json_encode($msg);

但如果数据库中的结果中包含中文,那么json_encode()函数会把这些中文编码之后再返回,那么接收到的中文就是被编码后的中文,就会成为类似 \5HF这样的Unicode码,那么如何才能正确显示中文呢? 这就需要先对中文进行 urlencode编码,再用json_encode编码,在接收后再用urlencode编码,就保证了中文不显示的问题,具体可以包装在一个函数中:
        function arrayRecursive(&$array, $function, $apply_to_keys_also = false) 
	{   
		static $recursive_counter = 0;   
		if (++$recursive_counter > 1000) 
		{     
			die('possible deep recursion attack');   
		}   
		foreach ($array as $key => $value) 
		{     
			if (is_array($value)) 
			{       
				arrayRecursive($array[$key], $function, $apply_to_keys_also);
			} 
			else 
			{       
				$array[$key] = $function($value);     
			}    
			if ($apply_to_keys_also && is_string($key)) 
			{       
				$new_key = $function($key);       
				if ($new_key != $key) 
				{         
					$array[$new_key] = $array[$key];         
					unset($array[$key]);       
				}     
			}   
		}   
		$recursive_counter--; 
	}
然后利用这个函数对数组进行操作:
        function json1($array) 
	{
		arrayRecursive($array, 'urlencode', true);
		$json = json_encode($array);
		return urldecode($json);
	}

那么上面从数据库中取出的$msg就可以放在这个函数中传到Android端:
        print json1($msg);
这样就解决了中文编码的问题。(注意中文在页面和数据库端的编码应该是utf-8)


本人经验,仅供参考!


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值