Wap技术的研究之路 |
| 作者:stinger 来源:WAPmo技术 发布时间:2006-4-26 1:16:09 |
|
第一次看到wap的时候是2001年吧,那时候xml才刚冒头出来,在网上查xml资料就查到wap这个东东,但是还没手机呢那会儿,就没注意它了,就知道它是xml的一个扩展。后来网上鼓吹了一下wap,都没冒出泡来就灭了。GPRS和CDMA1x出来后,这东东就活过来了,当今社会速度第一嘛,GPRS的理想速度据说有170多kb/s,CDMA1x的理想速度是130多kb/s(?偶不会记错吧),即使达不到这个速度也够用了,偶在GSM网里测试过,打开一个几十k的页面,就如同以前用Modem上网一样,慢的无法忍受。这里由衷地说一句GPRS真好,看嘛嘛快,去嘛嘛顺。 wml和xml是一样的,结构严谨,会html就会xml,会xml就会wml,wml一出来的时候,就大张旗鼓地提出很多标准,设置过wap服务器的朋友就清楚,教材上提的就有个5个MIME类型,其实我们用得到的就两个,一个wml,一个wbmp(这个类型现在已经不需要了吧,都是彩屏手机了啊),而wmlc、wmls、wmlsc就不会用到了,虽然wmls有人研究过,实际上很多手机都不支持wmls的,wmlc和wmlsc我想更没人会吧(有会的大虾么,告诉我吧,我在网上找这两个语言的语法规则好多次都没找到@_@),最后归纳起来,我们就需要一个标准就可以了,就是:wml。现在手机支持wml 1.2,这个规则比较完善了,虽然wap 2.0,也就是xhtml也出来了,实际上,wapforum.org的2.0规则都不通用,而Openwave因它的浏览器被大多数手机采用,从而使它的xhtml解析标准成为wap 2.0的标准。wap 2.0还不错啊,虽然偶没过多接触过,但是它的css和对大多数html标准的兼容,将会使手机更像一台电脑,xhtml是通用标准,有线和无线都支持,君不见,很多web网站也采用xhtml来制作了。但是还没上3G,xhtml的魅力无法表达啊,表达出来也是慢腾腾,犹抱琵琶半遮面的,看着难受。so,还是将就点,先用用wml 1.2。 wml标签一般都已经熟悉了(还有没熟悉的?就看看入门教材,偶就不转载了,懒啊)。令人困惑的也就一个,就是编码和解码。很多web网站也有这样的现象,不支持UTF-8编码,我常去那个csdn论坛,里面很多朋友就不理解,为什么页面成乱码了、为什么提交的数据变乱码了等等。通常的解决方法就是:你设置成gb2312吧,mime头和html里的meta都设置成gb2312。避开UTF-8编码不是解决问题的关键。UTF-8是什么,unicode是什么,这里就不累述了,资料太多啦,unix/linux下介绍这方面的Manual又是多如牛毛。这里说说怎么编码和解码UTF-8字符串。 UTF-8的特征是很明确的,小于128的字节就还是小于128的字节,只占一个字节,也就是Ascii码,大于128的字节,第一个字节的范围是0xC0到0xFD,其他字节的范围是0x80到0xBF,so,可以根据第一个字节判断该UTF-8字符占几个字节,它的定义是这样的: 0x00 - 0x7F 一个字节 0xC0 - 0xDF 两个字节 0xE0 - 0xEF 三个字节 0xF0 - 0xF7 四个字节 0xF8 - 0xFB 五个字节 0xFC - 0xFD 六个字节 我们用的最多的就是一个字节和三个字节的UTF-8编码,UTF-8是从unicode编码里延伸出来的,所以这两个编码可以互相转换,而不用查什么表。而要从Ascii转UTF-8和unicode,不同系统下解决的方法不一样。win32下有很多语言,那个asp转换编码就很简单,一个一个字节的算,但是由于asp是解析性语言,所以它的速度就惨不忍睹了,还好我们用在wap上,再多的数据量也就那么多kb,转换慢一点还是看不出来的。有人做过测试,对比C/Java/Perl/汇编等语言的速度,在一个1G大小的文件里查找一个字符串出现的次数,获取的结论是:C是最快的。C在win32下编码和解码UTF-8字符很好用,首先确定该字符串是否是UTF-8编码,然后再用函数转换。 #define IsUTF8Head(x) (((unsigned char)x>=0xC0 && (unsigned char)x<=0xFD)?1:0) #define IsUTF8Body(x) (((unsigned char)x>=0x80 && (unsigned char)x<=0xBF)?1:0) unsigned char UTF8Byte(unsigned char x) { if (x>0x00 && x<=0x7F) return(1); if (x>=0xC0 && x<=0xDF) return(2); if (x>=0xE0 && x<=0xEF) return(3); if (x>=0xF0 && x<=0xF7) return(4); if (x>=0xF8 && x<=0xFB) return(5); if (x>=0xFC && x<=0xFD) return(6); return(0); } unsigned char UTF8Detect(const unsigned char *s) { unsigned char *p = (unsigned char *)s; unsigned char cc = 0; unsigned int bc = 0; if (p==0) return(0); while (*p) { cc = UTF8Byte(*p++); if (cc==0) { ++bc; } else if (cc==2) { //Two Byte if (!IsUTF8Body(*p)) { ++bc; } p += 1; } else if (cc==3) { //Three Byte if (!(IsUTF8Body(*p) && IsUTF8Body(*(p+1)))) { ++bc; } p += 2; } else if (cc==4) { //Four Byte if (!(IsUTF8Body(*p) && IsUTF8Body(*(p+1)) && IsUTF8Body(*(p+2)))) { ++bc; } p += 3; } else if (cc==5) { //Five Byte if (!(IsUTF8Body(*p) && IsUTF8Body(*(p+1)) && IsUTF8Body(*(p+2)) && IsUTF8Body(*(p+3)))) { ++bc; } p += 4; } else if (cc==6) { //Six Byte if (!(IsUTF8Body(*p) && IsUTF8Body(*(p+1)) && IsUTF8Body(*(p+2)) && IsUTF8Body(*(p+3)) && IsUTF8Body(*(p+4)))) { ++bc; } p += 5; } } return((bc==0)?1:0); } char *UTF8ToChar(const char *s) { char *buf = 0; wchar_t *tmp = 0; unsigned int ml, wl; if (!UTF8Detect(s)) return(0); ml = MultiByteToWideChar(CP_UTF8, 0, s, -1, 0, 0); tmp = (wchar_t *)calloc(ml, sizeof(wchar)); if (tmp==0) return(0); MultiByteToWideChar(CP_UTF8, 0, s, -1, tmp, ml); wl = WideCharToMultiByte(CP_ACP, 0, tmp, -1, 0, 0, 0, 0); buf = (char *)calloc(wl, sizeof(char)); if (buf==0) { free(tmp); return(0); } WideCharToMultiByte(CP_ACP, 0, tmp, -1, buf, wl, 0, 0); free(tmp); return(buf); } char *CharToUTF8(const char *s) { char *buf = 0; wchar_t *tmp = 0; unsigned int ml, wl; if (s==0) return(0); ml = MultiByteToWideChar(CP_ACP, 0, s, -1, 0, 0); tmp = (wchar_t *)calloc(ml, sizeof(wchar_t)); if (tmp==0) return(0); MultiByteToWideChar(CP_ACP, 0, s, -1, tmp, ml); wl = WideCharToMultiByte(CP_UTF8, 0, tmp, -1, 0, 0, 0, 0); buf = (char *)calloc(wl, sizeof(char)); if (buf==0) { free(tmp); return(0); } WideCharToMultiByte(CP_UTF8, 0, tmp, -1, buf, wl, 0, 0); free(tmp); return(buf); } 在unix/linux下,有个很好用的东东:iconv,它可以转换各种编码。这里就不多叙述了。 Perl就更不用说了吧,有个现成的Encode包可以使用,也可以转换很多种编码。 |
| [] [返回上一页] [打 印] |
|
文章评论 |
