单字节指只占一个字,是英文字符。双字是占两个字节的,中文字符都占两个字节 单字节的英文是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]