zoukankan      html  css  js  c++  java
  • php截取字符串,无乱码

    今天面试,有一道题,要求截取中文字符无乱码。

    当时因为要赶去另一家去面试,没有仔细分析。

    虽然现在供职的这家公司b2c项目正在用,因为当时赶项目,是网上拿来直接用的。

    回来以后再重新整理了一下。

    代码贴出来:

    <?php
    header("Content-Type:text/html; charset=utf-8");
    function utf8_substr($str,$len){
        for($i=0;$i<$len;$i++){
    	    $temp_str=substr($str,0,1);
    	    if(ord($temp_str) > 127){
    		    if($i<$len){
    			    $new_str[]=substr($str,0,3);
    			    $str=substr($str,3);
    	    	}
    	    }else {
    		    $new_str[]=substr($str,0,1);
    		    $str=substr($str,1);
    	    }
        }
        return join($new_str);
    }
    ?>
    

    ord()返回字符串第一个字符的ascii值,因为英文,数字及特殊字符的ascii码都不大于127,

    ord()>127即可判断是中文。在utf8中,中文占3个字节所以遇到中文字符,用三个字节当一个字节即可。

    strlen("你好");输出6,可以验证这一点。

    如果是gbk则中英文都占2个字节;但是strlen("ab")英文字符都返回2个长度。

    strlen("你好");gbk返回4,utf8返回6; mb_strlen("你好","gbk");返回2;mb_strlen("你好","utf-8");返回2。

    所以如果是gbk只需要截取将3变成2即可。

    要注意:计算总长的时候一定要用mb_strlen() [截取的时候不用]

    也可以用

    string mb_strcut ( string $str , int $start [, int $length [, string $encoding ]] )

    string mb_substr ( string $str , int $start [, int $length [, string $encoding ]] )

    int mb_strlen ( string $str [, string $encoding ] )

    继续面试题,将字符翻转包括中英文

    如果对php比较熟悉,很容易想到的是strrev(),但是很不幸,strrev翻转中文会乱码。

    也有人会想到:

    $arr = explode('',$str);
    $temp = array_reverse($arr);
    implode('',$temp);

    很不幸,explode用''做分割,js可以。

    对于中文,utf-8编码:

    function reverse($str)
    {
    		$ret = "";	
    		$len = mb_strlen($str,"utf-8");
    		for($i=0; $i< $len; $i++)
    		{
    			echo $i;
    			$arr[] = mb_substr($str, $i, 1, "utf-8");
    		}
    		return implode("", array_reverse($arr));
    }
    print_r(reverse("你好"));
    

    用mb_strlen();对于这个mb_strwidth();会把中文的字符算为2。循环会空转。

    中间可以加上:

    if(strlen($str)==mb_strlen($str)){
            return strrev($str);  
    }
    如果感觉不错,请 一个!
    by simpman
  • 相关阅读:
    easyExcel入门
    UML-从需求到设计--迭代进化
    UML-操作契约总结
    102. Binary Tree Level Order Traversal
    98. Validate Binary Search Tree
    95. Unique Binary Search Trees II
    96. Unique Binary Search Trees
    94. Binary Tree Inorder Traversal
    84. Largest Rectangle in Histogram
    92. Reverse Linked List II
  • 原文地址:https://www.cnblogs.com/simpman/p/3187420.html
Copyright © 2011-2022 走看看