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]