今晚在寫框架的表單驗證類時,需要判斷某個字符串長度是否在指定區間內,很自然地,想到了PHP中的strlen函數。
代碼如下
$str = 'Hello world!中';
echo strlen($str); // 輸出12
測試一下中文
代碼如下$str = '你好,世界!';
echo strlen($str); // GBK或GB2312下輸出12,UTF-8下輸出18
PHP內置的字符串長度函數strlen無法正確處理中文字符串,它得 到的只是字符串所占的字節數。對於GB2312的中文編碼,strlen得到的值是漢字個數的2倍,而對於UTF-8編碼的中文,就是3倍的差異了(在 UTF-8編碼下,一個漢字占3個字節)。
下面這個實例摘自大名鼎鼎的WordPress,非常精確的哦,另外需要注意的是本函數僅適用於utf-8 編碼下的字符串。
代碼如下
function utf8_strlen($string=null){
// 將字符串分解為單元
preg_match_all("/./us", $string, $match);
// 返回單元個數
return count($match[0]);
}
但以上代碼在UTF-8編碼下並不能處理GBK/GB2312的中文字符串,因為GBK/GB2312的中文字符會被識別為兩個字符而計算出來的中文字符數量會翻倍,於是我想到了這麼一個辦法:
代碼如下 $tmp = @iconv('gbk', 'utf-8', $str);
if(!empty($tmp)){
$str = $tmp;
}
preg_match_all('/./us', $str, $match);
echo count($match[0]);
可兼容GBK/GB2312及UTF-8編碼,經小量數據測試通過,但暫未確定是否完全正確