zoukankan      html  css  js  c++  java
  • 记一次js中和php中的字符串长度计算截取的终极问题和完美解决方案

    1.js是用unicode算长度的,比如单字节的算1,中文也算1,但是正常我们想让两个单字节算1,如何计算这个长度


    第一种解决方案,用正则,如下 /[u0x00-u0xff]/,天真的想着,这样就可以匹配所有unicode在这个之间的了,但是,这个正则不匹配标点符号,比如空格,逗号,不知道为什么,所以,只能去遍历charCodeAt了 代码如下:

    function getStringWidth(s){
    		var length = 0;
    		for(var i=0;i<s.length;i++) {
    			if(s.charCodeAt(i)>255) {
    				length++;
    			} else {
    				length += 0.5;
    			}
    		}
    		return Math.ceil(length);
    	}



    2.php的长度要分编码的,我只说utf8,写php还gbk的,我就不说什么了

    如何计算长度呢?

    正则?[x00-xff]这玩意不匹配空格逗号,不能像js那样用ord来算,因为ord只计算一个字节

    这儿有个极品的办法,我用mb_substr从字符串的尾部每次截一个,然后判断截完之后和截之前的长度差,如果差1那么长度就+0.5,大于1那么长度就+1,最终取个ceil,完美解决,代码如下:

    function get_string_width($s) {
            $length = 0;
            while(strlen($s)>0) {
                $old_length = strlen($s);
                $s = mb_substr($s, 0,-1,'utf8');
                if(($old_length-strlen($s))==1) {
                    $length += 0.5;
                } else {
                    $length += 1;
                }
            }
            return ceil($length);
        }

    测试完毕,符合要求


    3。截取

    function cut_string($s,$l=140) {
            $length = get_string_width($s);
            if($length>$l) {
                while(get_string_width($s.'...')<=$l) {
                    $s = mb_substr($s, 0,-1,'utf8');
                }
                $s .= '...'; 
            }
            return $s;
        }


  • 相关阅读:
    HTTPD之五---HTTP协议、相关工具及状态码
    HTTPD之四----实现HTTPD正向代理与反向代理
    第十三周---DNS原理、实现智能DNS及源码编译mariadb数据库
    DNS之五----实现智能DNS
    sqoop 导入增量数据到hive
    Hadoop 二次排序
    Spark foreachpartiton和mappartition的异同
    hadoop 实现多文件输出
    spark 实现多文件输出
    Scala 中 call by name & call by value 的区别
  • 原文地址:https://www.cnblogs.com/snake-hand/p/3186844.html
Copyright © 2011-2022 走看看