详解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中Session的概念
Oct 09 PHP
php 小乘法表实现代码
Jul 16 PHP
php文件打包 下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件
Jun 13 PHP
PHP以及MYSQL日期比较方法
Nov 29 PHP
android上传图片到PHP的过程详解
Aug 03 PHP
php实现三级级联下拉框
Apr 17 PHP
CI框架集成Smarty的方法分析
May 17 PHP
php使用PDO从数据库表中读取数据的实现方法(必看)
Jun 02 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
Jun 13 PHP
PHP编程一定要改掉的5个不良习惯
Sep 18 PHP
PhpSpreadsheet设置单元格常用操作汇总
Nov 13 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
PHP7标量类型declare用法实例分析
2016/09/26 PHP
如何修改yii2.0自带的user表为其它的表
2017/08/01 PHP
thinkPHP5.1框架使用SemanticUI实现分页功能示例
2019/08/03 PHP
JS获取月的最后一天与JS得到一个月份最大天数的实例代码
2013/12/16 Javascript
鼠标左键单击冲突的问题解决方法(防止冒泡)
2014/05/14 Javascript
jquery实现的一个文章自定义分段显示功能
2014/05/23 Javascript
js结合正则实现国内手机号段校验
2015/06/19 Javascript
jquery实现点击展开列表同时隐藏其他列表
2015/08/10 Javascript
js实现当复选框选择匿名登录时隐藏登录框效果
2015/08/14 Javascript
javascript定义类和类的实现实例详解
2015/12/01 Javascript
jQuery的内容过滤选择器学习教程
2016/04/18 Javascript
全面解析JavaScript中apply和call以及bind(推荐)
2016/06/15 Javascript
浅谈js内置对象Math的属性和方法(推荐)
2016/09/19 Javascript
利用BootStrap弹出二级对话框的简单实现方法
2016/09/21 Javascript
JavaScript中正则表达式判断匹配规则及常用方法
2017/08/03 Javascript
用vue的双向绑定简单实现一个todo-list的示例代码
2017/08/03 Javascript
解析vue data不可以使用箭头函数问题
2018/07/03 Javascript
基于mpvue小程序使用echarts画折线图的方法示例
2019/04/24 Javascript
在 Vue 应用中使用 Netlify 表单功能的方法详解
2019/06/03 Javascript
ES6学习笔记之let与const用法实例分析
2020/01/22 Javascript
Javascript中Math.max和Math.max.apply的区别和用法详解
2020/08/24 Javascript
python小技巧之批量抓取美女图片
2014/06/06 Python
用xpath获取指定标签下的所有text的实例
2019/01/02 Python
连接pandas以及数组转pandas的方法
2019/06/28 Python
Python文件操作中进行字符串替换的方法(保存到新文件/当前文件)
2019/06/28 Python
Python urlencode和unquote函数使用实例解析
2020/03/31 Python
python神经网络编程实现手写数字识别
2020/05/27 Python
HTML5的Video标签有部分MP4无法播放的问题解析(多图)
2017/08/18 HTML / CSS
市场营销专科应届生求职信
2013/11/24 职场文书
技校个人求职信范文
2014/01/25 职场文书
小学生读书感言
2014/02/12 职场文书
工作证明范本(2篇)
2014/09/14 职场文书
2014个人反腐倡廉思想汇报
2014/09/15 职场文书
村支部书记群众路线对照检查材料思想汇报
2014/10/08 职场文书
管辖权异议上诉状
2015/05/23 职场文书
springboot如何接收application/x-www-form-urlencoded类型的请求
2021/11/02 Java/Android