还是遍历文件目录发现的,通过scandir($path) 获得到的目录结构,当含有中文时,编码变成了gb2312 ,在之后输出的过程中,print_r() 或者var_dump() 都可以输出带有乱码的内容。php代码文件本身是utf-8编码的,所以出现乱码只能是获取到的字串与当前utf-8不匹配,输出才会有乱码。猜想可能是因为中文字串保存格式不是utf-8导致的。

在网上找了一个帖子json_encode中文变null,他的情况是php代码文件保存格式为gbk,稍微有些不同,但造成json_encode输出异常的原因应该大致相同。

可以用他写的gbk2utf8方法,也可以自己写一个,通过iconv方法将当前不属于utf-8编码的字符串修改成utf-8。

function gbk2utf8($data)
{
    if (is_array($data)) {
        return array_map('gbk2utf8', $data);
    }
    return iconv('gb2312', 'utf-8', $data);
}

知道字串编码的

$str = "xx中文xx";
iconv('gbk','utf-8',$str);

或者不知道编码

$str = "xx中文xx";
$encode = mb_detect_encoding($str, array("ASCII","GB2312","GBK","UTF-8"));
$str = iconv($encode, "utf-8", $str);

确认是中文的话,字符串原始格式写gbk或者gb2312,iconv都认的,都可以转成功。

mb_detect_encoding() 方法第二个参数,是提供常见的编码,方法会先去匹配自定义的编码,如果找不到,再去库里一一匹配编码格式,提供第二个参数(字串可能的编码)可以缩短方法执行时间,增加效率。