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