[原创]小试 PHP5.2 的JSON

news/2024/7/7 18:56:53

 

小试 PHP5.2 的JSON


作者:heiyeluren
博客:
http://blog.csdn.net/heiyeshuwu
时间:2006-12-17

PHP 5.2 出来了,听说改进了很多,包括内存管理、速度等等都要比 PHP5.0、PHP5.1要快不少,而且有人测试过,比PHP 4.4.x 还要快,确实很值得升级,而且PHP是向下兼容的,同时还Fixed了200多个bug,并且增加了JSON、Filter、Zip、Date等功能。具体可以查看Ben写的文章。

今天我就小试了一下PHP 5.2 内置了JSON功能,JSON主要是用于Ajax里面的远程访问时候的数据交换格式,可以说是用来在Ajax中取代XML格式的一个轻量级数据交换格式,潜力不容小瞧,因为Google Maps就是抛弃XML而使用JSON的典型例子。

想了解JSON,可以查看这里查看更多文章,同时想了解关于格式定义可以参考JSON官方网站,关于更多JSON的资料请Google。

一、使用JSON

查看新版的PHP手册中JSON函数一节,JSON就增加了两个API,json_decode(),对一个json字符串进行解码,json_encode()是生成一个json字符串,我们就简单的测试一下。

构建如下PHP代码:

php
//对象
class JsonTest{
 
var $id = 1;
 
var $name = 'heiyeluren';
 
var $gender = '';
}
$obj = new JsonTest;
echo json_encode($obj)." ";

//数字索引数组
$arr1 = array(1, 'heiyeluren', '');
echo json_encode($arr1)." ";

//关联索引数组
$arr2 = array("id"=>1, "name"=>'heiyeluren', "gender"=>'');
echo json_encode($arr2)." ";

//多维数字索引数组
$arr3 = array(array(1, 'heiyeluren', ''), array(1, 'heiyeluren', ''));
echo json_encode($arr3)." ";

//关联索引数组
$arr4 = array(array("id"=>1, "name"=>'heiyeluren', "gender"=>''), array("id"=>1, "name"=>'heiyeluren', "gender"=>''));
echo json_encode($arr4)." ";
?>

浏览器输出:

{"id":1,"name":"heiyeluren","gender":""}
[1,"heiyeluren",""]
{"id":1,"name":"heiyeluren","gender":""}
[[1,"heiyeluren",""],[1,"heiyeluren",""]]
[{"id":1,"name":"heiyeluren","gender":""},{"id":1,"name":"heiyeluren","gender":""}]


按照JSON格式定义,我们可以发现上面的几个特点:

1. 纯的数字索引是按照JavaScript能够识别的数组来存储的
2. 关联索引数组是按照JavaScript对象的形式来构造的
3. 多维关联索引是按照外围是JavaScript数组,中间的索引数组是对象
4. 无法识别中文,所有的中文字符串显示为空


现在构造一个JavaScript的解析访问看看:

 

 

< script  language ="javascript" >
 s1 
=   ' {"id":1,"name":"heiyeluren","gender":""} ' ;
 s2 
=   ' [1,"heiyeluren",""] ' ;
 s3 
=   ' [{"id":1,"name":"heiyeluren","gender":""},{"id":1,"name":"heiyeluren","gender":""}] ' ;
 eval(
" a1= "   +  s1);
 eval(
" a2= "   +  s2);
 eval(
" a3= "   +  s3);

 alert(a1);
 alert(a2);
 alert(a3);
script>


我们看alert输出:

[object Object]
1,heiyeluren,
[object Object],[object Object]

 

二、JSON中文问题的处理


基本就是比较简单的测试了,至于其他数据类型,像整形、字符串等太简单没有测试的必要。现在我们来考虑一下PHP的JSON扩展无法处理中文的问题,我们基本的解决方案就是在服务器端转化前对中文进行转码,比如转成URL编码或者进行进制转换,然后客户端进行相应的转换。

1. URL 编码方式

php自带了 urlencode() 和 urldecode() 函数,用于URL编码的转换,但是JavaScript客户端没有,所以构造两个JavaScript的转码函数。(以下代码只适合IE浏览器和GBK/GB2312编码

< Script language = " VBScript " >
/*  VBscript构建字符串变成ASC码  */
Function  str2asc(strstr)
 str2asc 
=   hex ( asc (strstr))
End Function

/*  VBscript构建ASC变成字符串码  */
Function  asc2str(ascasc)
 asc2str 
=   chr (ascasc)
End Function
script>
< Script  Language ="JavaScript" >
/*  URL Encode  */
function  urlencode(str){
  
var  ret = "" ;
  
var  strSpecial = " ! " #$ %& ' ()*+,/:;<=>?[]^`{|}~%";
  for(var i=0;i
   var chr = str.charAt(i);
    var c=str2asc(chr);
    tt += chr+":"+c+"n";
    if(parseInt("0x"+c) > 0x7f){
      ret+="%"+c.slice(0,2)+"%"+c.slice(-2);
    }else{
      if(chr==" ")
        ret+="+";
      else if(strSpecial.indexOf(chr)!=-1)
        ret+="%"+c.toString(16);
      else
        ret+=chr;
    }
  }
  return ret;
}

/* URL Decode */
function urldecode(str){
  var ret="";
  for(var i=0;i
   var chr = str.charAt(i);
    if(chr == "+"){
      ret+=" ";
    }else if(chr=="%"){
     var asc = str.substring(i+1,i+3);
     if(parseInt("0x"+asc)>0x7f){
      ret+=asc2str(parseInt("0x"+asc+str.substring(i+4,i+6)));
      i+=5;
     }else{
      ret+=asc2str(parseInt("0x"+asc));
      i+=2;
     }
    }else{
      ret+= chr;
    }
  }
  return ret;
}


 

 

2. 进制转换的方式

PHP有 bin2hex() 函数用于把二进制转换成16进制,但是确没有把16进制转换成2进制的函数,我们简单把两个函数都构造一下:

php
//2进制到16进制(PHP已经自带,本程序只是演示)
function bin2hex($str){
    
$arr = unpack("H*", $str);
    
return $arr[1];
}

//16进制到2进制
function hex2bin($str){
    
return pack("H*", $str);
}
?>


客户端的JavaScript两个函数都没有,我们只能够自己构造。(以下函数只适合IE浏览器和UTF8编码

< Script  Language ="JavaScript" >
// 二进制转换为16进制
function  bin2hex(bin){
 
var  result  =   "" ;
 
var  temp  =   "" ;
 
for ( var  i = 0 ;i < bin.length;i ++ ){
  
var  chr  =  bin.charCodeAt(i);
  
if (chr > 127 ){
   chr 
=  encodeURIComponent(bin.charAt(i));
  }
else {   
   chr 
=  chr.toString( 16 );  
  }
  result 
+=  chr;
 } 

 
for ( var  i = 0 ;i < result.length;i ++ ){
  
var  chr  =  result.charAt(i);
  
if (chr != ' % ' ){
    temp
+= chr;
  }
 } 
 
return  temp.toLowerCase();


// 16进制转换为2进制
function  hex2bin(hex){
 
var  result  =   "" ;
 
if (hex.length  &&  hex.length  %   2   ==   0 ){

  
for ( var  i  =   0  ;i < hex.length;i += 2 ){
   result 
+=   " % " ;
   result 
+=  hex.substr(i,  2 );
  }
  result 
=  decodeURIComponent(result);
 }
 
return  result;
}
Script>
 

 

总的来说,这些左转右转编码的方式效率都不会很高,特别是处理的字符串很多的时候,效率不敢恭维,我们还是需要寻找更快速的方式,或者最好是PHP的JSON扩展能够直接支持中文,那就最好了。

 

三、结束语

看了这么简单有趣的功能,那么还不赶紧把你的PHP版本升级到5.2,并且尝试使用Ajax来构建你的系统,另外,抛弃恶心可恶麻烦的XML,来拥抱我们快速简洁的JSON吧,你一定会获得惊喜的。


 

 



http://www.niftyadmin.cn/n/3652554.html

相关文章

iptables的使用以及一些注意事项

文章目录iptables概述内核态netfilter/用户iptables关系防火墙中的四表五链四表五链规则表的优先顺序规则链之间的匹配顺序规则链内的匹配顺序iptables的安装iptables防火墙的配置方法1、使用system-config-firewall2、使用iptables 命令行。iptables 命令行配置方法&#xff1…

firewalld的各种需求

文章目录firewalld概述firewalld 与 iptables 的区别&#xff1a;1.2.3.firewalld 区域的概念&#xff1a;firewalld防火墙预定义了9个区域:1、trusted&#xff08;信任区域&#xff09;&#xff1a;2、public&#xff08;公共区域&#xff09;&#xff1a;3、external&#xf…

[转]JavaScript格式化代码程序

发现一个不错的JavaScript写的格式JavaScript代码的程序&#xff0c;能够压缩代码&#xff0c;也能够格式化&#xff0c;功能不错。<HTML><HEAD><TITLE>FormatTITLE><META content"MSHTML 6.00.2800.1528" nameGENERATOR><META conten…

Putty使用技巧总结

PS: 都是网上收集的&#xff0c;姑妄看之 putty输入中文默认状态下向putty中输入中文会变成...可以用以下方法解决&#xff1a; Category中选择Window>Appearance>change...将字体设置为Fixedsys字符集设 置为CHINESE_GB2312 然后别忘了save一下要不就得每次更改了。主要…

编译安装mysql 服务

1.将安装mysql 所需软件包传到/opt目录下 2.安装环境依赖包 yum -y install \ gcc \ gcc-c \ ncurses \ #字符终端下图形互动功能的动态库 ncurses-devel \ #ncurses开发包 bison \ #语法分析器 cmake #mysql需要用cmake编译安装yum -y install gcc gcc-c ncurs…

[转]存储也开源:FreeNAS 安装及使用初体验

【介绍】FreeNAS 是开源的 NAS 服务器&#xff0c;它能将一部普通 PC 变成网络存储服务器。该软件基于 FreeBSD&#xff0c;Samba 及 PHP&#xff0c;包含了一套支持多种软 RAID 模式的操作系统和网页用户界面。用户可通过 Windows、Macs、FTP、SSH 及网络文件系统 &#xff08…

LAMP的部署和安装

文章目录 一、LAMP概述1、各组件作用2、各组件安装顺序3、安装包 二、编译安装Apache httpd服务1.关闭防火墙&#xff0c;将安装Apache所需软件包传到/opt目录下2.安装环境依赖包3.配置软件模块4.编译及安装5.优化配置文件路径&#xff0c;并把httpd服务的可执行程序文件放入路…

Discuz 5.0 中读取纯真IP数据函数分析

Discuz 5.0 中读取纯真IP数据库函数分析Discuz 5.0 不在使用自己的IP数据&#xff0c;而是使用纯真IP的数据格式&#xff0c; 存取纯真IP数据库稍微有点麻烦&#xff0c;它的存储格式比较特殊也很有趣&#xff0c;具体的格式分析参考下面两个链接&#xff0c;其他语言实现参考…