PHP-XML数据交互问题

问题:
1、接收数据的编码是GBK,怎么转成UTF-8?
2、simplexml_load_string解析xml格式数据后,如何将结果中的xml对象转换成数组?

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

前置知识:

  1. 计算机使用0,1进行数据存储,表示不同的字符需要不同的01排列组合,就出现了编码标准规范,规定编码表和编码方式;
  2. 例如ASCII编码表中@对应的二进制是0100 0000,这里要注意这个二进制在计算机中是以1个字节存储的,规定怎么样的存储就是编码方式;
  3. 你也可以规定2个字节来存储,如以1字节来读取2字节就会出现乱码,这就是有时候打开文件出现乱码的原因;
  4. 编码的知识点可以类比数据结构中的逻辑结构(编码表)和存储结构(编码方式)。

使用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函数会报错,形如:

可以正则匹配替换一下:

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;

}

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

你可能感兴趣的:(后端,php)