日期:2014-05-16 浏览次数:20598 次
项目中有这样一个需求。前端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>?
?
经过验证,我们就可以得出一些有用的信息,我们就可以来控制前端输入到多少个字符了。
?
?
?
?
?