详解PHP中的mb_detect_encoding函数使用方法


Posted in PHP onAugust 18, 2015

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 转换并判断是否等值,效率不高
function is_utf8 ($str) {
  if ($str === iconv('UTF-8', 'UTF-8//IGNORE', $str)) {
    return 'UTF-8';
  }
}
// 多种编码的情况
function detect_encoding ($str) {
  foreach (array('GBK', 'UTF-8') as $v) {
    if ($str === iconv($v, $v . '//IGNORE', $str)) {
      return $v;
    }
  }
}

通过以上方式得到字符串编码信息后,就可以利用 iconv 或 mb_convert_encoding 来转换编码了。

Call to undefined function mb_detect_encoding()错误解决


Windows系统下:
一、Fatal error: Call to undefined function: iconv() in C:\Program Files\AppServ\www\...\xxx.php on line 82
php中有个iconv()函数用来进行字符编码转换
在php.ini文件中同样存在extension=php_iconv.dll
这样的声明才能保证这个函数正常使用
如果在php.ini文件中的extension=php_iconv.dll前面有分号
表示被注释掉了,如果存在分号就要去掉,并重新启动服务器
再次运行程序才能解决

二、Fatal error: Call to undefined function: mb_detect_encoding() in C:\Program Files\AppServ\www\...\xxx.php on line 1355
1、找到php扩展目录(我的php扩展目录的路径是:C:\Program Files\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.cnis exist<br />PHP Fatal error:  Call to undefined function mb_detect_encoding() in /home/xu/web/whois/whois.main.php on line 98
在网上查找了各种资料后才知道原来是php-mbstring这个php插件没有安装(有些同学可能是没有在php.ini中起用此插件),写下此段文件以作笔记。

    首先使用yum或者apt安装mbstring.so,使用命令:yum install php-mbstring或者apt-get install php-mbstring (ubuntu用户最好使用apt-cache search mbstring搜索一番后再安装,软件名字可能有误)

    然后修改php.ini:执行vim /etc/php.ini,加入extension="/usr/lib/php/modules/mbstring.so"内容,后面的路径可能不一样,根据mbstring.so存放的目录做相应的修改即可。一般是不用更改的。

PHP 相关文章推荐
PHP EOT定界符的使用详解
Sep 30 PHP
php获取数组长度的方法(有实例)
Oct 27 PHP
curl不使用文件存取cookie php使用curl获取cookie示例
Jan 26 PHP
phpmailer中文乱码问题的解决方法
Apr 22 PHP
PHP中使用glob函数实现一句话删除某个目录下的所有文件
Jul 22 PHP
ThinkPHP行为扩展Behavior应用实例详解
Jul 22 PHP
php+ajax实现文章自动保存的方法
Dec 30 PHP
php中引用&amp;的用法分析【变量引用,函数引用,对象引用】
Dec 12 PHP
Laravel框架生命周期与原理分析
Jun 12 PHP
Laravel 之url参数,获取路由参数的例子
Oct 21 PHP
laravel5.6中的外键约束示例
Oct 23 PHP
PHP面试题 wakeup魔法 Ezpop pop序列化与反序列化
Apr 11 PHP
深入讲解PHP Session及如何保持其不过期的方法
Aug 18 #PHP
php微信公众平台开发之获取用户基本信息
Aug 17 #PHP
PHP添加图片水印、压缩、剪切的封装类
Aug 17 #PHP
php中switch语句用法详解
Aug 17 #PHP
Linux系统下PHP-FPM的安装和配置教程
Aug 17 #PHP
PHP连接Nginx服务器并解析Nginx日志的方法
Aug 16 #PHP
ThinkPHP开发框架函数详解:C方法
Aug 14 #PHP
You might like
PHP开发中的错误收集,不定期更新。
2011/02/03 PHP
批量获取memcache值并按key的顺序返回的实现代码
2011/06/14 PHP
PHP中获取文件扩展名的N种方法小结
2012/02/27 PHP
PHP中把有符号整型转换为无符号整型方法
2015/05/27 PHP
PHP利用正则表达式将相对路径转成绝对路径的方法示例
2017/02/28 PHP
PHP调用微博接口实现微博登录的方法示例
2018/09/22 PHP
jQuery 全选效果实现代码
2009/03/23 Javascript
javascript for循环从入门到偏门(效率优化+奇特用法)
2012/08/01 Javascript
ExtJS4中使用mixins实现多继承示例
2013/12/03 Javascript
Jquery实现textarea根据文本内容自适应高度
2015/04/03 Javascript
js实现touch移动触屏滑动事件
2015/04/17 Javascript
从零开始学习Node.js系列教程六:EventEmitter发送和接收事件的方法示例
2017/04/13 Javascript
jQuery EasyUI开发技巧总结
2017/09/26 jQuery
解决vue2中使用axios http请求出现的问题
2018/03/05 Javascript
jQuery实现获取动态添加的标签对象示例
2018/06/28 jQuery
vue表单自定义校验规则介绍
2018/08/28 Javascript
js实现经典贪吃蛇小游戏
2020/03/19 Javascript
[51:20]完美世界DOTA2联赛PWL S2 Magma vs PXG 第一场 11.28
2020/12/01 DOTA
[01:15]PWL S2开团时刻第二期——他们杀 我就白给
2020/11/25 DOTA
使用SAE部署Python运行环境的教程
2015/05/05 Python
详细介绍Python的鸭子类型
2016/09/12 Python
python+matplotlib实现动态绘制图片实例代码(交互式绘图)
2018/01/20 Python
浅析Python 3 字符串中的 STR 和 Bytes 有什么区别
2018/10/14 Python
解决pycharm remote deployment 配置的问题
2019/06/27 Python
python使用SQLAlchemy操作MySQL
2020/01/02 Python
简单了解Django项目应用创建过程
2020/07/06 Python
纯CSS3实现圆圈动态发光特效动画的示例代码
2021/03/08 HTML / CSS
世界上最好的帽子:Tilley
2016/11/27 全球购物
最好的商品表达自己:Cafepress
2019/09/04 全球购物
印尼第一大家居、生活和家具电子商务:Ruparupa
2019/11/25 全球购物
应聘医药代表职位求职信
2013/10/21 职场文书
市场营销管理制度
2014/01/29 职场文书
大学军训感言800字
2014/02/27 职场文书
购房协议书范本
2014/04/11 职场文书
Java面试题冲刺第十六天--消息队列
2021/08/07 面试题
Fluentd搭建日志收集服务
2022/09/23 Servers