1.字符串簡介:
一個字符串 就是由一系列的字符組成,因此,一個字符就是一個字節,而字符串中的中文和編碼有關,gbk是雙字節,utf8是三字節
2.php字符串長度的計算
php中有strlen()和mb_strlen()兩個函數來計算字符串的長度,那麼這兩個函數的區別在哪裏?怎麼取捨呢?接下來我們來看看他們的原理
1>strlen()和mb_strlen()在字符全是英文字符的時候,功能是一樣的,兩者的區別主要在中英文混排的時候,這兩個會產生兩個不同的結果,接下來看個測試例子
<?php $str="A中B文C字D符E"; echo strlen($str); echo "<br />"; echo mb_strlen($str,"UTF8"); //輸出結果 //17 //9 ?>
從結果中我們可以看出:strlen()方法計算時將一個utf8編碼的中文字符當做3個字符,所以"A中B文C字D符E"的長度爲3*4+5=17
而用mb_strlen()方法計算時,選定內碼爲UTF8,則會將一個utf8編碼的中文字符長度當做1來計算,所以它計算出來的長度爲9;
中英文混排串的佔位符計算:
一箇中文字符的佔位是2,英文字符是1,如果一個混排的字符串有m箇中文,n個英文,佔位計算爲:
<?php $str="A中B文C字D符E"; //公式如下 echo (strlen($str)+mb_strlen($str))/2; //輸出結果 13 ?>
php內置的字符串長度函數strlen無法正確處理中文字符串,它得到的只是字符串所佔的字節數。對於gb2312的中文編碼,strlen得到的值是漢字個數的2倍,而utf8編碼的中文就是3倍差異
採用mb_strlen函數可以很好的解決這個問題,它的第二個可選參數用於指定字符編碼。例如得到utf8的字符串$str的長度,可以用mb_strlen($str,'UTF-8')。如果省略第二個參數,則會使用php的內部編碼,內部編碼可以通過mb_internal_encoding()函數得到,需要注意的是mb_strlen函數並不是php核心函數,使用前需要確保php.ini中加載了php_mbstring.dll,即確保“extension=php_mbstring.dll”這一行存在並沒有被註釋掉,否則會出現未定義函數的問題
3.php翻轉字符串的探討
現在有這樣一個問題:說讓你把一個字符串倒序輸出,你會怎麼寫
大部分人可能會這樣寫
<?php $str = "hello china,I love you"; function str_rev($str){ $tmpstr = ''; $len = strlen($str); if($len==1){ return $str; }else{ for($i=$len-1;$i>=0;$i--){ $tmpstr.=$str[$i]; } return $tmpstr; } } //或者 function str_rev1($str){ $tmpstr = ''; $len = strlen($str); if($len==1){ return $str; }else{ for($i=1;$i<$len;$i++){ $tmpstr.=substr($str,-$i,1); } return $tmpstr; } }?>//再或者有的人直接用 php核心函數 strrev(); echo str_rev($str);
這個程序表面上看上去沒什麼問題,好像很完美,但現在我們來嘗試下中英文混排的字符串,比如說$str="hello 中國,I LOVE YOU";再用上面的例子試試,會是什麼結果,呵呵試過的人想必都看到結果不是我們想要的,出現了亂碼,其實不難理解,看看上面解說的就明白個八九不離十了,怎麼解決呢?
可以用以下方式來解決
/** * 反轉utf8的字符串,使用mb開頭的函數 * @param string $str * @return string */ function mb_strrev($str) { $len = mb_strlen($str, 'UTF-8'); $string = ''; for ($i = $len - 1; $i >= 0; $i--) { $string .= mb_substr($str, $i, 1, 'UTF-8'); } return $string; }
/** * 反轉utf8的字符串,使用正則和數組實現 * @param string $str * @return string
*/
function utf8_strrev($str, $reverse_numbers = true){ $pattern = $reverse_numbers ? '/./us' : '/(\d+)?./us'; preg_match_all($pattern, $str, $ar); return join('',array_reverse($ar[0])); } echo utf8_strrev($str), '<br />';
echo mb_strrev($str);
4.php編碼判斷討論
判斷中文和編碼有關,gbk是雙字節,utf8是三字節,可以根據中文的編碼範圍來判斷
1.GBK(gb2312/gb18030) [\x80-\xff]
2.UTF-8(Unicode) [\u4e00-\u9fa5]