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]

 

 

posted @ 2011-07-21 16:14  MR.Punk  阅读(292)  评论(0编辑  收藏  举报