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

php中能够使用 mb_detect_encoding(卡塔尔(قطر‎ 函数来剖断字符串是怎么样编码的。

string iconv ( string
in_charset, string out_charset, string str )
注意:第二个参数,除了能够内定要转会到的编码以外,还足以追加三个后缀://TRANSLIT
和 //IGNORE,当中 //TRANSLIT
会自动将无法一贯转账的字符形成叁个或多少个像样的字符,//IGNORE
会忽视掉不能够转化的字符,而暗许效果是从第叁个地下字符截断。
Returns the converted string or FALSE on failure.

当在php中使用mb_detect_encoding函数举行编码识别时,非常多个人都遭受过识别编码有误的标题,比方对与GB2312和UTF-8,或然UTF-8和GBK(这里根本是对此cp936的决断State of Qatar,英特网说是由于字符短时mb_detect_encoding会产出误判。

string mb_convert_encoding ( string str, string to_encoding [, mixed
from_encoding] )
需要先enable mbstring 扩展库,在 php.ini里将;
extension=php_mbstring.dll 前面的 ; 去掉
mb_convert_encoding
能够钦点多样输入编码,它会依附内容自动识别,可是执行功能比iconv差太多;

代码如下:

使用:

$encode = mb_detect_encoding($keytitle, array("ASCII","UTF-8","GB2312","GBK","BIG5"));if($encode == "UTF-8"){ $keytitle = iconv("UTF-8","GBK",$keytitle);}

意识iconv在转移字符”—”到gb2312时会出错,若无ignore参数,全体该字符后边的字符串都爱莫能助被封存。不管什么,这些”—”都无能为力转移成功,不能输出。
其余mb_convert_encoding未有那一个bug.

这段代码的功用是检查实验字符串的编码是还是不是UTF-8,是的话就转变为GBK。然则当
$keytitle =
“%D0%BE%C6%AC”;时。检查评定结果却是UTF-8.那个bug其实不算是bug,写程序时也不应有过于注重mb_detect_encoding,当字符串相当短时,检查测量检验结果产生偏差的恐怕超大。扫除办法,代码如下:

诚如景观下用
iconv,只有当遭受不恐怕鲜明原编码是何种编码,或许iconv转变后不恐怕符合规律展现时才用mb_convert_encoding
函数.

$encode = mb_detect_encoding($keytitle, array("ASCII","GB2312","GBK","UTF-8");

 

八个参数分别是:被检查实验的输入变量、编码格局的检查评定顺序(一旦为真,前边自动忽视卡塔尔(قطر‎、strict形式对编码检查测验的一一进行调度,将最大大概放在眼下,那样缩小被指皁为白转变的火候。平日要先排gb2312,当有GBK和UTF-8时,须要将常用的排列到后面。

 代码如下

PHP字符串编码的转移和推断

/**
*机关推断把gbk或gb2312编码的字符串转为utf8
*能半自动推断输入字符串的编码类,假设自个儿是utf-8就不要更改,不然就调换为utf-8的字符串
*支撑的字符编码类型是:utf-8,gbk,gb2312
*@$str:string 字符串
*/
function yang_gbk2utf8($str){
    $charset =
mb_detect_encoding()($str,array(‘UTF-8′,’GBK’,’GB2312′));
    $charset = strtolower($charset);
    if(‘cp936’ == $charset){
        $charset=’GBK’;
    }
    if(“utf-8” != $charset){
        $str = iconv($charset,”UTF-8//IGNORE”,$str);
    }
    return $str;
}

GBK 和 UTF-8 编码的更动是贰个特出恶心的事务,比方像 PHP 中的
json_encode 本人根本不帮衬 GBK
格局的编码。有多少个库函数能够扶持理编辑码的更动,常常可以想到的便是 iconv
函数,使用起来也足够爽:iconv(‘GBK’, ‘UTF-8//IGNORE’, ‘测验字符串’State of Qatar; //
将字符串由 GBK 编码调换为 UTF-8 编码

下边作者随着看在转移字符编码的局地难点

但 iconv
只可以解决编码预先领会的情状,假如字符串编码未知,则要求先探测其编码,这个时候大概会用到
mb_string 扩展库:mb_detect_encoding(‘测量试验字符串’卡塔尔国;

用mb_detect_encoding($str卡塔尔(قطر‎;函数,使用该函数必需张开php的extension=php_mbstring.dll扩展

可是 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; } }}

<?php
$str=”测试ing”;
$cha=mb_澳门新葡萄京娱乐场,detect_encoding($str);
echo $cha;
?>

因此上述措施得到字符串编码消息后,就能够使用 iconv 或
mb_convert_encoding 来调换编码了。

自家在gb2312页面上输的,但是输出的结果是 UTF-8 很意外,还平素不找到原因。

Call to undefined function mb_detect_encoding(卡塔尔国错误息灭

自家想统一退换为UTF-8编码,用下边方法

Windows系统下:一、Fatal error: Call to undefined function: iconv()in C:/Program Files/AppServ/ on line
82php中有个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/ on line 13551、找到php扩充目录
在extensions目录上边找到php_mbstring.dll文件,2、将php_mbstring.dll这么些文件拷贝到php.ini文件所在的目录下(我的php.ini文件所在的目录:C:/WINDOWS卡塔尔3、用记事本打开php.ini文件,使用迅速键Ctrl+F查找extension=php_mbstring.dll4、
借使php.ini文件中存在extension=php_mbstring.dll,去掉该行extension前面的支行,
假如不真实,就在其余extension=…的下一行参加extension=php_mbstring.dll,
最后记得保存php.ini文件5. 双重起动你的Apache服务器

<?php
$str=”测试ing”;
$cha=mb_detect_encoding($str);
$s = iconv($cha,”UTF-8″,$str);
var_dump($s);
?>

赶巧发掘实际不拷贝php_mbstring.dll那些文件到php.ini所在目录也行

结果重临:
string(0) “”
真是不可思议,为啥会如此。

Linux系统下:

 代码如下

现身上边难点时:

<?php
$str=”测试ing”;
$cha=mb_detect_encoding($str);
$s = iconv(“GB2312″,”UTF-8”,$str);
var_dump($s);
?>

PHP 1. {main}() /home/xu/web/whois/ab.cn.php:0PHP 2.
base_func-is_exist() /home/xu/web/whois/ab.cn.php:21PHP 3. strftime()
/home/xu/web/whois/whois.mysql.php:46ab.cnis existbr /PHP Fatal error:
Call to undefined function mb_detect_encoding(State of Qatar in
/home/xu/web/whois/whois.main.php on line
98在网络寻找了各样资料后才知晓原本是php-mbstring这几个php插件未有设置,写下此段文件以作笔记。

 
归来结果准确。开掘该函数mb_detect_encoding($str卡塔尔(قطر‎;推断照旧不标准。不知是如何来头。
函数string mb_convert_encoding ( string $str , string $to_encoding
[, mixed $from_encoding ] )
 
可以转移为钦定编码的字符串,俺写了例子

率先使用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寄存的目录做相应的改正就可以。日常是绝不校勘的。

<pre lang=”php” line=”1″>
<?php
$a=”我很好”;
echo mb_convert_encoding ($a,’UTF-8′);
?>

可结果是:
??潞?潞?
于今的主题素材正是本人假若把分裂的字符串编码情势统一更动为utf-8,假使事前知情改造吧能够用iconv,但万一不通晓该编码该如何做吧?

标题3:iconv难题,假诺调换的字符串,第多个字节的编码大于一定的数会重临空.

如:

 代码如下

<?php
$str=chr(254).”测试ing”.chr(254);
$s = iconv(“GB2312″,”UTF-8”,$str);
var_dump($s);
?>

返回
string(0) “”

mb_convert_encoding的用法见官方:

PHP中的此外贰个函数iconv也是用来调换字符串编码的,与上函数功能相通。

下边还会有点详实的例证:
iconv — Convert string to
requested character encoding
(PHP 4 >= 4.0.5, PHP 5)
mb_convert_encoding — Convert character encoding
(PHP 4 >= 4.0.6, PHP 5)

用法:
string mb_convert_encoding ( string str, string to_encoding [, mixed
from_encoding] )
需要先enable mbstring 扩展库,在 php.ini里将;
extension=php_mbstring.dll 前面的 ; 去掉
mb_convert_encoding
能够钦定各类输入编码,它会基于剧情自动识别,不过进行功效比iconv差太多;

string iconv ( string in_charset, string out_charset, string str )
留神:第1个参数,除了能够钦点要转正到的编码以外,还是能增添多少个后缀://TRANSLIT
和 //IGNORE,在那之中 //TRANSLIT
会自动将无法一贯转账的字符产生一个或多少个近乎的字符,//IGNORE
会忽视掉不能够转变的字符,而暗中认可效果是从第三个非法字符截断。
Returns the converted string or FALSE on failure.

使用:
意识iconv在转换字符”—”到gb2312时会出错,若无ignore参数,全体该字符前面包车型地铁字符串都力不能支被保存。不管什么样,这些”—”都力不可能支转移成功,无法输出。
别的mb_convert_encoding未有这几个bug.
貌似景观下用
iconv,唯有当际遇无法明确原编码是何种编码,可能iconv转化后不恐怕符合规律显示时才用mb_convert_encoding
函数.

from_encoding is specified by character code name before conversion. it
can be array or string – comma separated enumerated list. If it is not
specified, the internal encoding will be used.
/* Auto detect encoding from JIS, eucjp-win, sjis-win, then convert str
to UCS-2LE */
$str = mb_convert_encoding($str, “UCS-2LE”, “JIS, eucjp-win,
sjis-win”);
/* “auto” is expanded to “ASCII,JIS,UTF-8,EUC-JP,SJIS” */
$str = mb_convert_encoding($str, “EUC-JP”, “auto”);

例子:

 代码如下

<?php 
 $content = iconv(“GBK”, “UTF-8”, $content); 
 $content = mb_convert_encoding($content, “UTF-8”, “GBK”); 
?>

例子

本条能够依照输入输出的字符编码进行退换

 代码如下

<?php
function phpcharset($data, $to) {
 if(is_array($data)) {
  foreach($data as $key =>
$val) {
   $data[$key] = phpcharset($val, $to);
  }
 } else {
  $encode_array = array(‘ASCII’, ‘UTF-8’, ‘GBK’, ‘GB2312’, ‘BIG5’);
  $encoded = mb_detect_encoding($data, $encode_array);
  $to = strtoupper($to);
  if($encoded != $to) {
   $data = mb_convert_encoding($data, $to, $encoded);
  }
 }
 return $data;
}
?>

发表评论

电子邮件地址不会被公开。 必填项已用*标注