js中文長度校驗以及位元組
單位元組指只佔一個字,是英文字元。雙字是佔兩個位元組的,中文字元都佔兩個位元組 單位元組的英文是Byte;位元是最小的數值單位,它的英文是Bit。 一個位元組包含8個位元,通常計算機初學者接觸到的ASCII碼就是單位元組字元,由於計算機是二進位制的,1個位元位只可以表示為0或者1這兩種數,那8個位元(一般從右至左)就可以有0~127(2的8次方再減1)的不同的數值表示。 雙位元組字元即是包含了兩個位元組共16位元。 一般比較好理解的就是:英文字母屬於單位元組字元,而漢字則屬於雙位元組字元。因為英文字母、數字、符號等完全可以用128種不同的數值來表示,而漢字太多則不能,所以才需要擴充套件到雙位元組。
因此判斷漢字的方法就簡單了,只需要判斷是不是單位元組:
( c >= 0x0001 && c <= 0x007e) || (0xff60<=c && c<=0xff9f)) 或者 c 小於256
或者判斷雙位元組 c 大於256
mootools中有長度校驗的方法,如下:
lengthnewnumchn:function(el,min, max){
var v=el.get('value');
var w = 0;
if(v == "") return true;
var max1=Math.floor(max/3);
for (var i=0; i<v.length; i++) {
var c = v.charCodeAt(i);
//單位元組加1
if ((c >= 0x0001 && c <= 0x007e) || (0xff60<=c && c<=0xff9f)) {
w++;
}
else { //漢字加3
w+=3;
}
}
if (w > max || w<min) {
el.errors.push(this.options.alerts.lengthchnnum.replace("%1",min).replace("%2",max).replace("%1",min).replace("%3",max1));
return false;
}
}
也可以如下:
//漢字及英文,數字長度校驗
lengthnumchn:function(el,min,max){
var v = el.get('value');
if(v == "") return true;
var len = 0 ;
var max1 = Math.floor(max/2);
for (var i = 0; i < v.length; i++) {
var c = v.charCodeAt(i) > 255 ? 2 : 1;
len += c;
}
if(len < min || len > max) {
el.errors.push(this.options.alerts.lengthchnnum.replace("%1",min).replace("%2",max).replace("%1",min).replace("%3",max1));
return false;
}
}
對應資料庫漢字佔用幾個位元組,執行下面的sql即可看到 :
SELECT lengthb('的')FROM DUAL ;
匹配中文字元的正則表示式: [\u4e00-\u9fa5]
匹配雙位元組字元(包括漢字在內):[^\x00-\xff]