php接收 xml数据包,PHP-XML数据交互问题

问题:

1、接收数据的编码是GBK,怎么转成UTF-8?

2、simplexml_load_string解析xml格式数据后,如何将结果中的xml对象转换成数组?

第1问,接收数据的编码是GBK,怎么转成UTF-8

前置知识:计算机使用0,1进行数据存储,表示不同的字符需要不同的01排列组合,就出现了编码标准规范,规定编码表和编码方式;

例如ASCII编码表中@对应的二进制是0100 0000,这里要注意这个二进制在计算机中是以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解码后还是编码之前的格式,而不是对方的编码。例如,"中文"(UTF-8)base64_encode后是 5Lit5paH

对方的编码是GBK,原样返回 5Lit5paH

base64_decode后得到的"中文"还是UTF-8,不会是GBK

第2问,xml对象转换成数组?

这个问题本质是多维数组,也就是广义表的遍历问题。

要注意simplexml_load_string函数解析时,xml头部标明的编码要和数据的编码一致,例如将GBK转UTF-8后,xml报文头部还是标明GBK函数会报错,形如:<?xml version="1.0" encoding="GB2312"?>

可以正则匹配替换一下:preg_replace('/encoding="([a-zA-z0-9]+)"/i','encoding="UTF-8"',$content);

遍历函数如下:function objToArr($content)

{

if (is_string($content)) return $content;

if (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) ? (array)$arr : $arr

];

//如果是对象则按深度转为数组

if (is_object($arr)) {

$point = &$content;

foreach ($depth as $v) {

$point = &$point[$v];

}

$point = (array)$arr;

}

}

}

}

return $content;

}

注:思否第一篇,如有不正确的地方,欢迎各位指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值