PHP中獲取中英文混合字串長度

2021-08-27 07:20:37 字數 1644 閱讀 4755

今晚在寫框架的表單驗證類時,需要判斷某個字串長度是否在指定區間內,很自然地,想到了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)

else

那麼有什麼方便而實用的方法可以獲得含中文字串的長度呢?可以用正則計算出中文字元的個數,在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的中文字串(感謝oc_china提出),因為gbk/gb2312的中文字元會被識別為兩個字元而計算出來的中文字元數量會翻倍,於是我想到了這麼乙個辦法:

$tmp

=@iconv

('gbk'

,'utf-8'

,$str

);if

(!empty

($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")]

)

Django 擷取中英文混合字串

在列表顯示的時候,我們常常要擷取文章標題的長度,python擷取字串,本來很簡單的,但是中文和英文的寬度不一樣,在頁面看起來長度就差很遠了 length7 這是中文長度七 粗略來算 是粗略哦 乙個中文字元的寬度大概等於兩個英文本元的寬度。乙個中文字元的utf8編碼長度為3,gbk為2 所以將使用gb...

C 中英文混合字串對齊

private static string padrightex string str,int totalbytecount string w str.padright totalbytecount dcount return w 這段 來自 的改進。採用utf 8 coding.getbyteco...

lua如何擷取中英文混合字串

lua在utf8下乙個中文字長度為3,這樣在中英文混排時擷取字串就比較麻煩,下面的函式是中文字長度為1下的處理 獲取utf8編碼字串長度,中文長度為1 function utfstrlen str local len str local left len local cnt 0 local arr ...