php检测文件编码的方法示例 绝对完美性能绝对高

写这边文章的目的是为了让很多朋友少走弯路, 因为我也上网查了下  没有看到比较好的文章

都是一些什么数组比较啊 类似下图这样的 而且百度上我看到的大部分都是这类 我也不知道是谁写的 

php检测文件编码的方法示例 绝对完美性能绝对高_第1张图片

这个效率应该是极差的 后面还md5  这到底要消耗多少性能 咱就不说了  

我这里使用的方法只需要比较3个字节  我相信很多做过c++的朋友应该知道  utf8 unicode的文档的二进制开头是不一样的

这里我们需要借助一个神器 winhex  做过逆向的应该对这个不陌生   那么直接上图

php检测文件编码的方法示例 绝对完美性能绝对高_第2张图片

可以看到文件里的内容是123456 但是开头是有3个字节的  这3个字节代表是utf-8编码的文档

那么我们只要在代码里判断这3个字节 是不是等于这个值 就可以知道 他是不是utf-8编码的文档 

这3个字 我们称为硬编码  是永远不会变的 不管任何utf-8的编码的文档 只要在win平台 绝对就是这个值

大家可以自己试下  另存为utf-8编码 看一下 就知道了 

下面上php代码

$hFile = fopen($filename,"rb");
    if ($hFile)
    {
        $fileData = fread($hFile,filesize($filename));
    }
    fclose($hFile);
//这里的unpack 可以自行百度 函数的主要功能就是将内容转换成二进制  这样我们只用了一行代码 就实现了对文件编码的比较 效率就不用说了
//这里的判断 如果开头这3个字节 不是等于EF BB BF 那么就进行转码 其实还欠缺 比如如果文件是unicode 那么只需要加上unicode开头的2个字节 进行判断 就可以做到几乎完美
    if (unpack("C",$fileData[0])[1] != 0xEF &&unpack("C",$fileData[1])[1]  != 0xBB && unpack("C",$fileData[2])[1] != 0xBF)  
    {
        try{
            $fileData = iconv("ASCII","UTF-8",$fileData);
        }
        catch(Exception $e){
            return 3;
        }
    }

 

你可能感兴趣的:(php)