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
  • 相关阅读:
    Redis cluster学习 & Redis常识 & sort操作
    【Todo】【转载】JVM学习
    【Todo】【转载】Java中的锁机制2
    【转载】git命令和svn的对比
    【Todo】抽象渗漏法则 & 找到理想员工 & 软件开发成功 12 法则 & Joel on Software
    【转载】Java中的锁机制 synchronized & 偏向锁 & 轻量级锁 & 重量级锁 & 各自优缺点及场景 & AtomicReference
    JS里面匿名函数的调用 & 变量作用域的实验
    【Todo】深入理解Java虚拟机 读书笔记
    poj 2503 Babelfish
    hdu4493 Tutor
  • 原文地址:https://www.cnblogs.com/simpman/p/3187420.html
Copyright © 2011-2022 走看看