截取字符串,返回指定长度

包含汉字、空格、特殊符号、英文等实际长度获取

1.关于如何判断中英文双字符

str.charCodeAt(index) 可以返回相应的位置的字符的Unicode编码(唯一码)

判断方式一:
if(str.charCodeAt(i) & 0xff00) != 0){//双字节}
这种方式根据获取的Unicode编码与0xff00做‘与’运算,从而进行筛检;
0xff00是 “1111 1111 0000 0000” 的十六进制表示法;
单字节的Unicode编码的二进制最多只有八位,与操作后,结果一定是0

判断方式二:
根据1111 1111转换后等于255,可以得到只要大于255就可以
if(str.charCodeAt(i) & 0xff00)>255){//双字节}

2.获取长度

/*
*获取字符串实际占位长度(包含,汉字、英文、符号、空格等...)
* @param {string} str
* @return {number} len
* */
function getLength(str) {
    var len = 0;
    for(var i = 0;i<str.length;i++){
        /*charCodeAt(index),返回指定位置的字符的Unicode编码*/
        if (str.charCodeAt(i)>255){
            len+=2;
        }else{
            len++;
        }
    }
    return len;
}

//另外一种思路:通过将字符通过正则转换成单字符占位,统计单字符长度
//str.replace(/[^x00-xff]/g,"ab").length

3.获取指定长度子串

/*
 * 按指定长度截取字符串(中文等占位2,英文等1)
 * @param {string,number} str,length (源字符串,截取长度)
 * @return {string} cutStr (截取后字符串)
 * */
function getCutStr(str,length) {
    var cutStr = '',
        len = 0;
    for(var i=0;i<str.length;i++){
        console.log(i)
        if(str.charCodeAt(i)>255){
            len+=2;
            if (len==length || len==length-1){
                cutStr = str.substring(0, i+1)
                return cutStr + '...';
            }
        }else{
            len++;
            if (len==length){
                cutStr = str.substring(0, i+1)
                return cutStr + '...';
            }
        };

    }
    if (len<=length){
        return str;
    }
}

参考:http://www.cnblogs.com/zhujl/archive/2011/10/13/2210414.html

原文地址:https://www.cnblogs.com/flora-dn/p/7562712.html