php识别文件编码,并读出内容,对大文件也很有效率

来源:互联网 发布:java中匿名内部类 编辑:程序博客网 时间:2024/05/22 12:26
<?php/** * 检测文件编码 * @param string $file_path 文件路径 * @return string $filesize 默认为空,获取文件的全部内容,如果仅需要获取文件编码类型,获取前一百个字符即可,配合detect_encoding方法使用 * @return string 返回文件内容,自动换行 */function fileToSrting($file_path, $filesize = '') {    //判断文件路径中是否含有中文,如果有,那就对路径进行转码,如此才能识别    if (preg_match("/[\x7f-\xff]/", $file_path)) {        $file_path = iconv('UTF-8', 'GBK', $file_path);    }    if (file_exists($file_path)) {        $fp = fopen($file_path, "r");        if ($filesize === '') {            $filesize = filesize($file_path);        }        $str = fread($fp, $filesize); //指定读取大小,这里默认把整个文件内容读取出来        return $str = str_replace("\r\n", "<br />", $str);    } else {        die('文件路径错误!');    }}/** * 获取文件编码类型 * @param  string $file_path    文件路径 * @param  string $filesize     需要获取的字符长度 * @return string               返回字符编码 */function detect_encoding($file_path, $filesize = '1000') {    $list = array('GBK', 'UTF-8', 'UTF-16LE', 'UTF-16BE', 'ISO-8859-1');    $str = fileToSrting($file_path, $filesize);    foreach ($list as $item) {        $tmp = mb_convert_encoding($str, $item, $item);        if (md5($tmp) == md5($str)) {            return $item;        }    }    return '遇到识别不出来的编码!';}/** * 自动解析编码读入文件 * @param string $file_path 文件路径 * @param string $charset 读取编码 * @return string 返回读取内容 */function auto_read($file_path, $filesize = '', $charset = 'UTF-8') {    $list = array('GBK', 'UTF-8', 'UTF-16LE', 'UTF-16BE', 'ISO-8859-1');    $str = fileToSrting($file_path, $filesize);    foreach ($list as $item) {        $tmp = mb_convert_encoding($str, $item, $item);        if (md5($tmp) == md5($str)) {            return mb_convert_encoding($str, $charset, $item);        }    }    return "";}$file_path = "鸟哥的linux私房菜第二版包括基础和服务器.chm";echo "<pre>";$time1 = microtime(true);print_r(detect_encoding($file_path, 10));$time2 = microtime(true);printf("识别编码时间为:%s 秒 \n", $time2 - $time1);exit;echo "\n";echo "\n";echo "\n";echo "\n";print_r(auto_read($file));echo "</pre>";$time3 = microtime(true);printf("将文件读出到字符串时间为:%s 秒 \n", $time3 - $time2);exit;

读取文件尽量不要用file_get_contents,因为这个函数消耗内存很厉害,如果你的文件有个10M+,那服务器肯定就挂了!不信可以试试,本地试。如果非用不可,建议先判断一下文件大小,大于500kb就放弃掉。

原创粉丝点击