当前位置: 首页 > 后端技术 > PHP

PHP-XML数据交互问题

时间:2023-03-29 21:26:34 PHP

问题:1、接收数据的编码是GBK,如何转换成UTF-8?2、simplexml_load_string解析xml格式数据后,如何将结果中的xml对象转成数组?问题1,接收数据的编码是GBK,如何转换成UTF-8前置知识:计算机使用0,1进行数据存储,也就是说不同的字符需要不同的01排列组合,有一个编码标准规范,规定了编码表和编码方法;比如@在ASCII编码表中对应的二进制是01000000,这里需要注意的是这个二进制在计算机中是以1字节存储的,编码方式是指定的存储方式;也可以指定2如果用1个字节读2个字节,就会出现乱码,这就是为什么有时打开文件会出现乱码的原因;编码的知识点可以类比为逻辑结构(编码表)和数据结构中的存储结构(编码方式)。使用php内置的mb_convert_encoding(content,new,old)函数进行转换。注意如果old不传,会自动检测编码(检测范围自己找函数文档),但是GBK是不包括的,所以old要写成GBK,例如:mb_convert_encoding($xml,'UTF-8','GBK,UTF-16LE,ISO-8859-1,UTF-8');注意:编码问题中有一种情况,就是将base64编码后的参数传递给对方,对方会原样返回给你。base64解码后还是编码前的格式,不是对方的编码。比如“Chinese”(UTF-8)经过base64_encode后是5Lit5paH,对方的编码是GBK。原样返回5Lit5paHbase64_decode后得到的“中文”还是UTF-8,不会是GBK。问题2,把xml对象转成数组?这个问题的本质是多维数组,即广义表的遍历问题。需要注意的是,在解析simplexml_load_string函数时,xml头标示的编码必须与数据的编码一致。比如GBK转UTF-8后,xml报文头仍然提示GBK函数会报错,如:可以换成正则匹配:preg_replace('/encoding="([a-zA-z0-9]+)"/i','encoding="UTF-8"',$content);遍历函数如下:functionobjToArr($content){if(is_string($content))return$content;如果(is_object($content))$content=(array)$content;$tmp=[["key"=>[],"value"=>$content]];while(!empty($tmp)){$arrs=array_shift($tmp);if(is_array($arrs['value'])){foreach($arrs['value']as$k=>&$arr){//记录深度$depth=$arrs['key'];array_push($depth,$k);//存储需要转换的类型$tmp[]=["key"=>$depth,"value"=>is_object($arr)?(数组)$arr:$arr];//如果是对象,会按深度转为数组if(is_object($arr)){$point=&$content;foreach($depthas$v){$point=&$point[$v];}$point=(array)$arr;}}}}return$content;}正确的地方,欢迎指正!