问题:
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;
}
注:思否第一篇,如有不正确的地方,欢迎各位指正!