註冊使用者名稱字元長度判斷細節

王滔發表於2015-06-22

        $username = '刷_單8元1單淘寶客服20元1小時_我Q125556733jff';
        var_dump(strlen($username));
        var_dump(Library\Common::username_patten($username));

 

一、使用strlen來判斷長度

 

裡面的一個漢字會認為長度是3個字元(utf-8編碼情況下一個漢字3個字元,gbk編碼就是2個字元長度)

例子:

 $username = '刷_單8元';
  var_dump(strlen($username));

 

長度是11。

 

刷,單,元  3*3=9

"_“和"8", 總共是2個長度

9+2=11

 

具體做試驗:

$username = '刷';

var_dump(strlen($username));//得到是長度值是3

 

二、使用正則匹配

         $username_patten = '/^[a-zA-Z0-9_\x{4e00}-\x{9fa5}]{3,30}$/u'; //字母、數字、下劃線、中文,漢字或字元加起來30個即可
        //注:\x{4e00}-\x{9fa5}作為漢字的範圍判斷只適合utf-8編碼情況下,gb2312不適合目前我們的專案統一使用utf8專案。

        if (preg_match($username_patten, $username)){

 

 

        }

 

特點:正則中會把一個漢字當成一個長度來計算。因為\x{4e00}已經指定了漢字編碼

 

解釋不是非常科學。記住這個細節的差異就可以了。

 

javascript的驗證長度研究

 

/*
 * +---------------------------------
 * 驗證指定的字元長度,用來做標題長度驗證
 * +---------------------------------
 */
function getStrLeng(str){
    
    var len = str.length;//js內部使用的是utf16編碼,如果是中文,一個漢字也算一個長度。所以返回的是字元長度,而不是位元組大小
    return len;
    
}
var len = getStrLeng("我們_j");//在js中,一箇中文漢str.length字也是一個長度,
/*
 JavaScript中的String內部表示方式始終是UTF16,而它的length也是始終按UTF16 code point去計算,簡而言之,length始終返回字元數量,而非位元組大小!
 為什麼有人測試發現對於同一個字串"張三",用UTF8編碼時返回2,用GBK則得到3呢?那是因為瀏覽器沒能正確識別檔案編碼,所以判斷錯了,返回3的結果是一個程式執行出錯的結果。
 參考:
 http://segmentfault.com/q/1010000000445715
 因為使用的是utf-16,所以這個編碼表裡面能夠找到所有的漢字,這樣情況下,就能夠當成一個字元了?
 反正它返回的不是實際的位元組長度,而是多少個字元。
 
 http://www.puritys.me/docs-blog/article-107-String-Length-%E4%B8%AD%E6%96%87%E5%AD%97%E4%B8%B2%E9%95%B7%E5%BA%A6.html
 
 使用 string.length 來計算長度時,中文字串會被當成是一個字來計算,因為 Javascript 是使用 multiple byte 計算,就像是 php 的 mb_strlen。
 不管是中文,英文,都當成一個字來算,所以總共是 6 個字,不過有時候我們並不想把中文字當成一個字來計算,因為中文字明明佔的 byte 數就是比較多,所以來看一下中文編碼吧。
*/


alert(len);



/*
 * +---------------------------------
 * 驗證指定的字元長度,用來做標題長度驗證
 * 這個函式驗證是按照位元組長度算,所以中文漢字在utf-8編碼中是算3個位元組
 * +---------------------------------
 */
function getStrLengByBytle(str){
    
    
}

 

相關文章