js處理包含中文的字符串


場景:

js中String類型自帶的屬性length獲取的是字符串的字符數目,但是前端經常會需要限制字符串的顯示長度,一個中文字符又大概占兩個英文小寫字符的顯示位置,所以中英文混合的情況下用length值來判斷顯示長度往往並不正確。

常規的解決辦法是遍歷字符串,中文字符計長度2,非中文字符計長度1,通過新計算出來長度總和來限制字符串的顯示長度。看代碼↓↓↓

var Tools ={
    //是否包含中文
    hasZh: function(str){
        for(var i = 0;i < str.length; i++)
        {
            if(str.charCodeAt(i) > 255) //如果是漢字,則字符串長度加2
                return true;
            return false;
        }
    },
    //重新計算長度,中文+2,英文+1
    getlen: function(str){
        var strlen = 0;
        for(var i = 0;i < str.length; i++)
        {
            if(str.charCodeAt(i) > 255) //如果是漢字,則字符串長度加2
                strlen += 2;
            else
                strlen++;
        }
        return strlen;
    },
    //限制長度
    limitlen: function(str, len){
        var result = "";
        var strlen = 0;
        for(var i = 0;i < str.length; i++)
        {
            if(str.charCodeAt(i) > 255) //如果是漢字,則字符串長度加2
                strlen += 2;
            else
                strlen++;

            result += str.substr(i,1);

            if(strlen >= len){
                break;
            }
        }
        return result;
    }
}

這種方法的原理是根據中英文的unicode編碼范圍不同來判斷的,中文占2個字節,英文占1個字節,所以中文的unicode編碼值肯定大於2^8-1=255。

上述方法可以更嚴謹一點:就是考慮unicode編碼范圍,具體的范圍可以戳Unicode Table

PS: 漢字的unicode編碼范圍16進制為4E00-9FA5,10進制則為:19968-40869,即判斷中文的准確表達式為:

str.charCodeAt(i)>=19968 && str.charCodeAt(i)<=40869

插一句不太嚴謹的話,代碼不用限制太嚴謹的范圍,畢竟你不知道用戶(測試)會輸哪些奇怪的東西。

收工!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM