关于编码,这篇文章可以作为参考 https://www.cnblogs.com/Chary/p/13813750.html
99%的网页中有指定所使用的编码,而且格式规范,一般使用如下代码。个别网页不怎么规范,或者没有指定编码,所以需要稍作处理
1 2 | < 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。
1 2 3 4 5 6 | 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!