答案:第一次看到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包可以使用,也可以转换很多种编码。
上一个:WAP中实现文字滚动
下一个:让WAP模拟器显示中文汉字