• 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
  • 相关阅读:
    Android 百度地图 SDK v3.0.0 (三) 添加覆盖物Marker与InfoWindow的使用
    玩转Web之html+CSS(一)---论坛首页表格的实现
    Android 百度地图 SDK v3.0.0 (二) 定位与结合方向传感器
    Android 百度地图 SDK v3.0.0 (一)
    RabbitMQ (五)主题(Topic)
    RabbitMQ (四) 路由选择 (Routing)
    数据结构中的排序算法
    冒泡排序
    hashMap与hashTable的区别
    Java重载与重写的区别
  • 原文地址:https://www.cnblogs.com/simpman/p/3187420.html
Copyright © 2020-2023  润新知