日期:2014-05-16  浏览次数:20576 次

javascript校验中英文混合字符长度

项目中有这样一个需求。前端html页面是用UTF-8编码的,数据库也是用UTF-8编码的。字符集均为unicode。数据库中的限制一般通常如下:

?

director	varchar2	100		导演
scriptwriter	varchar2	100		编剧
compere	varchar2	100		节目主持人
guest	varchar2	100		受访者
reporter	varchar2	100		记者

?? 这些字段都有一个长度限制,长度是以ascii码,也就是字节来计算的,这就带了一个中英文,或者是其他字符用utf-8编码的长度组合问题。可能这样说我说不明白,还是先举例子吧。

?

? 什么叫字符集,字符集就是符号的集合。通常我们用的符号就是文字。

??http://www.nengcha.com/code/unicode/class/这个网址给出了许多国家的字符集。如下面图示

?

同样英语的A,B,C,D,汉字的“你我他"这些都是符号,这些有关联,或者成一个系统的符号集合,我们称之为字符集。计算机认识字符集可不是通过”象形“,图像匹配之类进行文字符号识别的,每个符号编个码,就OK。例如在某种字符集中,我们给‘A'编码为1234,’B'为2345,我们就可以通过1234来展示‘A’,2345来展示'B'.A!=B这些关系,都可以通过编码获得。

?

?

但是人们的认识总是慢慢接近完美和正确的。中国人发电报,要给汉字编码,他要处理的符号集合就是简体汉字,大概千把个,然后用数字编码,叫做“国标2313”即GB2312这个转换方法。俄罗斯为了展示自己的文字,也搞个编码,同样日本人,蒙古人,玛雅人,古代中国人的甲骨文,繁体字,等等。如果不仔细规划,很可能这些同一个编码数字,用中国人的方法解释是个“马”字,但是俄罗斯的规则解释是个'Д'字。为了解决编码可能存在的冲突,国际组织就把所有的符号作为一个集合,这个集合如此之大,以致可以包含地球上所有文字符号,以及未来的符号。这就是unicode。这大概就是一个整体和局部的关系,同时兼顾了扩展,就像电信分配号段一样,可以照顾到所有,也可以扩展。

?

??编码方式有多种多样,编码方式的不同主要是为了提高存储,迅速解码等等。即使是同一个unicode,就有utf-8,utf-16等等编码方式。UTF-8的编码方式,我是从网上查找到了,是这样的:

符号先找到其unicode码,然后在进行UTF-8编码。

0000?-?007F?0xxxxxxx?
0080?-?07FF?110xxxxx?10xxxxxx?
0800?-?FFFF?1110xxxx?10xxxxxx?10xxxxxx?


例如“汉”字的Unicode编码是6C49。6C49在0800-FFFF之间,所以肯定要用3字节模板了:1110xxxx?10xxxxxx?10xxxxxx。将6C49写成二进制是:0110?110001?001001,?用这个比特流依次代替模板中的x,得到:11100110?10110001?10001001,即E6?B1?89。

?

我其实不太明白为什么这样做,感觉就像网络协议一样,一层套一层。符号--》unicode编码-->utf-8编码。

解码 UTF-8编码--》unicode码--》显示符号。 直接用unicode编解码不就OK了吗,可能是前面说的用字符集的一个子集来提高编解码的效率吧。

?

先不管这些了。很重要的信息就是红色那部分。我们再来看一下unicode码划分的字符集。

?

?

http://www.nengcha.com/code/unicode/class/

?

从这个图,我们可以看到unicode被不相交的分配给各个国家的文字符号,猜猜中国字分别在哪里了呢?啊,当然是字符最多的那一段了。

?

那么,我们的那个项目的问题,就转变成了:在数据库中,一个字段限制为20个字节,那么我输入几个unicode字符,就不可以再输入了?

?

?? ? ? 例如汉字“我”的utf-8编码占三个字节,那么我可以输入6个“我”加上2个‘a',刚好3*6+2=20,这样,我们就可以写一个页面测试一下了。

?

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

<body>
	ni hao!
<body>
	<script>
	var bb="年后\u0908,abИфcd";
	alert(bb);
	alert(bb.length);
	for(i=0;i<bb.length;i++)
	{
		var zi=bb.charAt(i);
		alert(zi);
		if(zi<='\u007F')
			alert(1);
		if(zi>'\u007F'&&zi<='\u07FF')
			alert(2)
		if(zi>'\u07FF'&&zi<='\uFFFF')
			alert(3);
	}
	</script>
?

?

经过验证,我们就可以得出一些有用的信息,我们就可以来控制前端输入到多少个字符了。

?

?

?

?

?