今晚在寫框架的表單驗證類時,需要判斷某個字串長度是否在指定區間內,很自然地,想到了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編碼,經小量資料測試通過,但暫未確定是否完全正確,盼有大牛指點一二。
以上本意是為了框架可以相容多種編碼格式,但一般在日常開發中,乙個專案是已經可以確定為何種編碼的,因此可以使用以下函式來方便地獲取字串長度:
inticonv_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 ...