php中英文字符串的研究

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]

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章