河汉清且浅,牵牛敦而纯

 

关于编码,这篇文章可以作为参考 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

 

posted on 2022-02-14 22:00  伊索  阅读(569)  评论(1编辑  收藏  举报