本文目錄一覽:
PHP字符串長度計算 – strlen()函數使用介紹
strlen()函數和mb_strlen()函數
在PHP中,函數strlen()返回字符串的長度。函數原型如下:
複製代碼
代碼如下:
int
strlen(string
string_input);
參數string_input為要處理的字符串。
strlen()函數返回字符串所佔的字節長度,一個英文字母、數字、各種符號均佔一個字節,它們的長度均為1。一個中午字符佔兩個字節,所以一個中午字符的長度是2。例如
複製代碼
代碼如下:
?php
echo
strlen(“”);
echo
strlen(“三知開發網”);
?
“echo
strlen(“”);”的運行結果:15
“echo
strlen(“三知開發網”);”的運行結果:15
這裡有一個疑問,一個中文字符不是佔2個字節嗎?“三知開發網”,明明是五個漢字,運行的結果怎麼會是15?
原因出在這裡:strlen()計算時,對於一個UTF-8的中文字符,會把它當做長度為3來處理。當出現中英文混排的情況下,怎麼準確的計算字符串的長度呢?這裡,得引入另外一個函數mb_strlen()。mb_strlen()函數的用法與strlen()幾乎一摸一樣,只是多了一個指定字符集編碼的參數。函數原型為:
複製代碼
代碼如下:
int
mb_strlen(string
string_input,
string
encode);
PHP內置的字符串長度函數strlen無法正確處理中文字符串,它得到的只是字符串所佔的字節數。對於GB2312的中文編碼,strlen得到的值是漢字個數的2倍,而對於UTF-8編碼的中文,就是3倍的差異了(在UTF-8編碼下,一個漢字佔3個字節)。
因此,下面的代碼能準確計算出中文字符串的長度:
複製代碼
代碼如下:
?php
$str
=
“三知sunchis開發網”;
echo
strlen($str).”br”;
//結果:22
echo
mb_strlen($str,”UTF8″).”br”;
//結果:12
$strlen
=
(strlen($str)+mb_strlen($str,”UTF8″))/2;
echo
$strlen;
//結果:17
?
原理分析:
strlen()計算時,對待UTF-8的中文字符長度是3,所以“三知sunchis開發網”的長度為5×3+7×1=22
在mb_strlen計算時,選定內碼為UTF8,則會將一個中文字符當作長度1來計算,所以“三知sunchis開發網”長度為5×1+7×1=12
剩下的就是純數學問題了,在此就不啰嗦了……
注意:對於mb_strlen($str,’UTF-8′),如果省略第二個參數,則會使用PHP的內部編碼。內部編碼可以通過mb_internal_encoding()函數得到。需要注意的是,mb_strlen並不是PHP核心函數,使用前需要確保在php.ini中加載了php_mbstring.dll,即確保“extension=php_mbstring.dll”這一行存在並且沒有被注釋掉,否則會出現未定義函數的問題。
PHP獲取中英混合字符串長度的方法
今晚在寫框架的表單驗證類時,需要判斷某個字符串長度是否在指定區間內,很自然地,想到了PHP中的strlen函數。
.代碼如下:
$str
=
‘Hello
world!’;
echo
strlen($str); //
輸出12
然而在PHP自帶的函數中,strlen及mb_strlen都是通過計算字符串所佔字節數來計算長度的,在不同的編碼情況下,中文所佔的字節數是不同的。在GBK/GB2312下,中文字符佔2個字節,而在UTF-8下,中文字符佔3個字節。
.代碼如下:
$str
=
‘你好,世界!’;
echo
strlen($str); //
GBK或GB2312下輸出12,UTF-8下輸出18
而我們在判斷字符串長度時往往需要判斷的是字符的數量,而非字符串所佔字節數,如在UTF-8下的這段PHP代碼:
.代碼如下:
$name
=
‘張耕暢’;
$len
=
strlen($name);
//
輸出
FALSE,因為在UTF-8下三個中文佔9個字節
if($len
=
3
$len
=
8){
echo
‘TRUE’;
}else{
echo
‘FALSE’;
}
那麼有什麼方便而實用的方法可以獲得含中文字符串的長度呢?可以用正則計算出中文字符的個數,在GBK/GB2312編碼下除以2,UTF-8編碼下則除以3,最後再加上非中文字符串的長度,但這樣未免太過麻煩。
WordPress這麼一段代碼,借鑒如下:
.代碼如下:
$str
=
‘Hello,世界!’;
preg_match_all(‘/./us’,
$str,
$match);
echo
count($match[0]); //
輸出9
思想是用正則表達式將字符串分割成單個字符,並直接用count計算出匹配到的字符數,便是我們想要的結果了。
但以上代碼在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編碼,經小量數據測試通過,但暫未確定是否完全正確,盼有大牛指點一二。
以上本意是為了框架可以兼容多種編碼格式,但一般在日常開發中,一個項目是已經可以確定為何種編碼的,因此可以使用以下函數來方便地獲取字符串長度:
.代碼如下:
int
iconv_strlen
(
string
$str
[,
string
$charset
=
ini_get(“iconv.internal_encoding”)
]
)
PHP 中如何獲得中英文混合字符串長度
$str=’中文a字1符’;
echo strlen($str);
echo ‘br /’;
echo mb_strlen($str,’UTF8′);
利用PHP函數計算中英文字符串長度的方法
本文實例講述了利用PHP函數計算中英文字符串長度的方法。分享給大家供大家參考。具體實現方法如下:
一般來說大家知道英文字符佔一個字節,而中文字符gbk佔兩個字符,utf8佔三個字符,很多人印象中php計算字符串長度就是strlen()函數,其實不然,它計算的是字節的長度而非字符的長度,那麼如何獲取一個字符串中字符的長度呢?還有有mb_strlen().
具體代碼如下:
複製代碼
代碼如下:echo
$str
=
‘PHP點點通’;
echo
strlen($str);
//3*1+3*3=12
echo
mb_strlen($str,
‘gb2312’);
//3*1+3*2=9
echo
mb_strlen($str,
‘utf-8’);
//6
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/286167.html