• PHP获取/判断HTML/网页的charset/编码


    关于编码,这篇文章可以作为参考 https://www.cnblogs.com/Chary/p/13813750.html

    99%的网页中有指定所使用的编码,而且格式规范,一般使用如下代码。个别网页不怎么规范,或者没有指定编码,所以需要稍作处理

    <meta charset="utf-8">
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
    

    以下代码是用 php 提取/判断当前网页/字符的编码会用到 mbstring 或者 iconv 

    # 判断 $html 编码并转为 utf-8。
    function html_get_charset($html){
        # 正则加 i 表示不区分大小写
        preg_match("'<meta.*?charset.*?=.*?\>'si", $html, $meta_charset);                 # 提取包含charset的 meta
        if(empty($meta_charset[0])) $meta_charset[0] = '';
        $meta_charset = preg_replace("/\r\n|\r|\n/", '', $meta_charset[0]);               # 删除回车和换行
        $meta_charset = preg_replace ("/\s(?=\s)/", "\\1", trim($meta_charset));          # 删除重复的空格
        $meta_charset = str_replace(array("= ", " =",), array("=", "=",), $meta_charset); # 删除=两侧的空格
        $meta_charset = str_replace(array("'", ' ', '>', '/', "\\",), array( '"', '"', '">', '', '',), $meta_charset);
        $meta_charset = preg_replace ("/\"(?=\")/", "\\1", trim($meta_charset));          # 删除重复的"
        $meta_charset = str_replace('"charset=', ' charset=', $meta_charset);
        // preg_match('~charset=([-a-z0-9_]+)~i', $meta_charset, $temp);
        // preg_match("/<meta.+?charset=[^\w]?([-\w]+)/i", $meta_charset, $temp);
        preg_match("'<meta.*?charset=(.+?)\".*?\>'si", $meta_charset, $temp);
        if(!empty($temp[1])) $charset = trim(str_replace('"', '', strtolower($temp[1])));
        elseif(extension_loaded('mbstring')) $charset = strtolower(mb_detect_encoding($html));
        else $charset = strtolower(chkcode($html));
        if(strstr($charset, 'gb2312')) $charset = 'gbk';
        return $charset;
    }
     
    # 判断charset
    function chkcode($html){
        $code = array(
            'GBK',
            'EUC-CN',
            'BIG5',
            'EUC-TW',
            'CP950',
            'BIG5-HKSCS',
            'UTF-8',
            'GB2312',
            'CP936',
            'BIG5-HKSCS:2001',
            'BIG5-HKSCS:1999',
            'ISO-2022-CN',
            'ISO-2022-CN-EXT',
            'SJIS',
            'JIS',
            'EUC-JP',
            'SHIFT_JIS',
            'eucJP-win',
            'SJIS-win',
            'ISO-2022-JP',
            'CP932',
            'ISO-2022-JP',
            'ISO-2022-JP-2',
            'ISO-2022-JP-1',
            'EUC-KR',
            'CP949',
            'ISO-2022-KR',
            'JOHAB',
        );
         
        foreach($code as $charset){
            if($html == @iconv('UTF-8', "$charset//IGNORE//TRANSLIT", @iconv($charset, 'UTF-8//IGNORE//TRANSLIT', $html))){
                return $charset;
                break;
            }
        }
        return 'UTF-8';
    }
    

      

    获取mbstring 和 iconv 支持编码的方法比较简单。在 linux 系统中用   iconv -l        列举所有已知的字符集

    用PHP代码打印出 mbstring  所支持的编码

     mbstring 列出的编码集比 iconv 列出的编码较精简, mbstring 虽然没有列出一些编码的子集,但是支持该子集。比如只列出了 GB18030 ,但是却支持 GBK 和 GB2312。

    print_r(mb_list_encodings());   # 打印当前mbstring支持的编码
    
    
    mb_internal_encoding("UTF-8");  # 设置内部字符编码为 UTF-8
    echo mb_internal_encoding();    # 显示当前的内部字符编码
    $enc = mb_detect_encoding($str, mb_list_encodings(), true); # 自动识别字符串的编码
    

    这里附带一个 iconv 支持的字符集

    https://files.cnblogs.com/files/yisuo/iconv-list.zip

  • 相关阅读:
    九度oj 题目1525:子串逆序打印
    九度oj 题目1516:调整数组顺序使奇数位于偶数前面
    九度oj 题目1490:字符串链接
    九度oj 题目1438:最小公倍数
    九度oj 题目1181:遍历链表
    九度oj 题目1179:阶乘
    九度oj 题目1077:最大序列和
    九度oj 题目1075:斐波那契数列
    九度oj 题目1074:对称平方数
    九度oj 题目1073:杨辉三角形
  • 原文地址:https://www.cnblogs.com/yisuo/p/15894337.html
Copyright © 2020-2023  润新知