鍍金池/ 問答/PHP  網(wǎng)絡(luò)安全/ mb_detect_encoding()函數(shù)檢測不準(zhǔn)確。

mb_detect_encoding()函數(shù)檢測不準(zhǔn)確。

我想通過mb_detect_encoding()函數(shù)動態(tài)獲取某個字符的編碼集,再通過iconv進(jìn)行編碼轉(zhuǎn)換,但是mb_detect_encoding()判斷的編碼類型不準(zhǔn),導(dǎo)致iconv()失效或亂碼。

//片段
if (is_string($k)) {
    $encoding = getEncoding($k);
    $k = iconv($encoding, "utf-8", $k);
}
//獲取編碼集
function getEncoding($data)
{
   return mb_detect_encoding($data, array("ASCII","GB2312","GBK",'BIG5','UTF-8'));
}
//測試
$k = "哈哈";
$encoding = getEncoding($k);
var_dump($encoding,$k);
$k = iconv($encoding, "utf-8", $k);
var_dump(getEncoding($k),$k);exit;

//輸出:string(5) "CP936" string(6) "哈哈" string(5) "CP936" string(9) "鍝堝搱"
回答
編輯回答
護(hù)她命

@蔣建勇
clipboard.png
老哥,我不是要抬杠哈,比如我輸入了一串英文,獲取字符集結(jié)果為ASCII,然后通過iconv轉(zhuǎn)成utf-8了,后面應(yīng)該返回utf-8才對。為什么還是返回的ASCII呢?我是比較疑惑的這一點(diǎn)。

2017年7月21日 08:58
編輯回答
巫婆

mb_detect_encoding — 檢測字符的編碼

string mb_detect_encoding ( string $str [, mixed $encoding_list = mb_detect_order() [, bool $strict = false ]] )

可見第二個參數(shù)是非必填的, 如果省略了 $encoding_list 將會使用 mb_detect_order() 自動獲取字符集, 所以可對代碼做如下調(diào)整:

return mb_detect_encoding($data);
return mb_detect_encoding($data, mb_detect_order());

修改后的code

<?php
/**
 * 獲取編碼集
 */
function getEncoding($string)
{
    return mb_detect_encoding($string, mb_detect_order());
}

//測試
$k = "哈哈";
$encoding = getEncoding($k);
var_dump($encoding, $k);

$k = iconv($encoding, "utf-8", $k);
var_dump(getEncoding($k), $k);

exit;

// 示例圖

圖片描述

2018年4月10日 14:05