zoukankan      html  css  js  c++  java
  • 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]

     

     

  • 相关阅读:
    我为什么要选择RabbitMQ ,RabbitMQ简介,各种MQ选型对比(转载)
    spring boot 使用application.properties 进行外部配置
    Nginx+Springboot+Vue 前后端分离 解决跨域问题
    windows7下RabbitMQ的安装
    七牛云 如何配置域名的 CNAME
    springboot接口 接收参数为实体对象跟MultipartFile对象报错。
    数据库性能优化之SQL语句优化(下)
    数据库性能优化之SQL语句优化(上)
    七个对我最好的职业建议
    程序员最艰巨的十大任务
  • 原文地址:https://www.cnblogs.com/MRPUNK/p/3849324.html
Copyright © 2011-2022 走看看