详解PHP中的mb_detect_encoding函数使用方法
php中可以使用mb_detect_encoding()函数来判断字符串是什么编码的。
当在php中使用mb_detect_encoding函数进行编码识别时,很多人都碰到过识别编码有误的问题,例如对与GB2312和UTF-8,或者UTF-8和GBK(这里主要是对于cp936的判断),网上说是由于字符短时mb_detect_encoding会出现误判。
代码如下:
$encode=mb_detect_encoding($keytitle,array("ASCII","UTF-8","GB2312","GBK","BIG5")); if($encode=="UTF-8"){ $keytitle=iconv("UTF-8","GBK",$keytitle); }
这段代码的作用是检测字符串的编码是否UTF-8,是的话就转换为GBK。
可是当$keytitle=“%D0%BE%C6%AC”;时。检测结果却是UTF-8.这个bug其实不算是bug,写程序时也不应当过于依赖mb_detect_encoding,当字符串较短时,检测结果产生偏差的可能性很大。
解决办法,代码如下:
$encode=mb_detect_encoding($keytitle,array("ASCII","GB2312","GBK","UTF-8");
三个参数分别是:被检测的输入变量、编码方式的检测顺序(一旦为真,后面自动忽略)、strict模式对编码检测的顺序进行调整,将最大可能性放在前面,这样减少被错误转换的机会。
一般要先排gb2312,当有GBK和UTF-8时,需要将常用的排列到前面。
PHP字符串编码的转换和判断
GBK和UTF-8编码的转换是一个非常恶心的事情,比如像PHP中的json_encode本身根本不支持GBK形式的编码。有两个库函数能够支持编码的转换,通常能够想到的就是iconv函数,使用起来也非常爽:
iconv('GBK','UTF-8//IGNORE','测试字符串');//将字符串由GBK编码转换为UTF-8编码
但iconv只能解决编码预先知道的情况,如果字符串编码未知,则需要先探测其编码,这时可能会用到mb_string扩展库:
mb_detect_encoding('测试字符串');
可是mb_detect_encoding存在一个硬伤,经常出现判断不准确的情况。或许这样就可以解决:
//使用iconv转换并判断是否等值,效率不高 functionis_utf8($str){ if($str===iconv('UTF-8','UTF-8//IGNORE',$str)){ return'UTF-8'; } } //多种编码的情况 functiondetect_encoding($str){ foreach(array('GBK','UTF-8')as$v){ if($str===iconv($v,$v.'//IGNORE',$str)){ return$v; } } }
通过以上方式得到字符串编码信息后,就可以利用iconv或mb_convert_encoding来转换编码了。
Calltoundefinedfunctionmb_detect_encoding()错误解决
Windows系统下:
一、Fatalerror:Calltoundefinedfunction:iconv()inC:\ProgramFiles\AppServ\www\...\xxx.phponline82
php中有个iconv()函数用来进行字符编码转换
在php.ini文件中同样存在extension=php_iconv.dll
这样的声明才能保证这个函数正常使用
如果在php.ini文件中的extension=php_iconv.dll前面有分号
表示被注释掉了,如果存在分号就要去掉,并重新启动服务器
再次运行程序才能解决
二、Fatalerror:Calltoundefinedfunction:mb_detect_encoding()inC:\ProgramFiles\AppServ\www\...\xxx.phponline1355
1、找到php扩展目录(我的php扩展目录的路径是:C:\ProgramFiles\AppServ\php\extensions)
在extensions目录下面找到php_mbstring.dll文件,
2、将php_mbstring.dll这个文件拷贝到php.ini文件所在的目录下(我的php.ini文件所在的目录:C:\WINDOWS)
3、用记事本打开php.ini文件,使用快捷键Ctrl+F查找extension=php_mbstring.dll
4、如果php.ini文件中存在extension=php_mbstring.dll,去掉该行extension前面的分号,
如果不存在,就在其他extension=...的下一行加入extension=php_mbstring.dll,
最终记得保存php.ini文件
5. 重新启动你的Apache服务器
刚刚发现其实不拷贝php_mbstring.dll这个文件到php.ini所在目录也行
Linux系统下:
出现下面问题时:
PHP 1.{main}()/home/xu/web/whois/ab.cn.php:0
PHP 2.base_func->is_exist()/home/xu/web/whois/ab.cn.php:21
PHP 3.strftime()/home/xu/web/whois/whois.mysql.php:46
ab.cnisexist<br/>PHPFatalerror: Calltoundefinedfunctionmb_detect_encoding()in/home/xu/web/whois/whois.main.phponline98
在网上查找了各种资料后才知道原来是php-mbstring这个php插件没有安装(有些同学可能是没有在php.ini中起用此插件),写下此段文件以作笔记。
首先使用yum或者apt安装mbstring.so,使用命令:yuminstallphp-mbstring或者apt-getinstallphp-mbstring(ubuntu用户最好使用apt-cachesearchmbstring搜索一番后再安装,软件名字可能有误)
然后修改php.ini:执行vim/etc/php.ini,加入extension="/usr/lib/php/modules/mbstring.so"内容,后面的路径可能不一样,根据mbstring.so存放的目录做相应的修改即可。一般是不用更改的。