PHP-XML数据交互问题
码农天地 -语言:PHP问题:1、接收数据的编码是GBK,怎么转成UTF-8?2、simplexml_load_string解析xml格式数据后,如何将结果中的xml对象转换成数组?
第1问,
前置知识:
计算机使用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,原样返回 5Lit5paHbase64_decode后得到的"中文"还是UTF-8,不会是GBK第2问,
这个问题本质是多维数组,也就是广义表的遍历问题。
不过要注意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;
}
注:思否第一篇,如有不正确的地方,欢迎各位指正!
特别申明:本文内容来源网络,版权归原作者所有,如有侵权请立即与我们联系(cy198701067573@163.com),我们将及时处理。
php介绍
PHP即“超文本预处理器”,是一种通用开源脚本语言。PHP是在服务器端执行的脚本语言,与C语言类似,是常用的网站编程语言。PHP独特的语法混合了C、Java、Perl以及 PHP 自创的语法。利于学习,使用广泛,主要适用于Web开发领域。