php生成WAP页面的详细讲解
2024-05-04 23:04:48
供稿:网友
wap(无线通讯协议)是在数字移动电话、个人手持设备(pda等)及计算机之间进行通讯的开放性全球标准。由于静态的wap页面在很多方面不能满足用户个性化的服务请求,因此通过wap服务器端语言产生动态的wml页面,具有很广泛的应用价值和很高的商业价值。
wap应用结构非常类似于internet,一个典型的wap应用请求是这样的:首先,具有wap用户代理功能的移动终端(wap手机等)通过内部运行的微浏览器(micro browser)对某一网站以无线方式发送wap服务请求。该请求先由wap网关截获,对信息内容进行编码压缩,以减少网络数据流量,同时根据需要将wap协议转换成http协议,然后将处理后的请求转送到相应wap服务器。在wap服务器端,根据页面扩展名等性质,被请求的页面直接或由服务器端脚本解释后输出,再经网关传回用户。
从上述wap应用流程可以看到,生成动态wap页面与动态产生web网页的过程非常类似。但是由于wap应用使用的wml语言来源于语法严格的xml,因此要求输出的格式必须按wap网页的规范输出。同时,由于wap协议的应用范围、移动客户端的软硬件水平等特殊性,对每次输出的页面的大小、图像的格式及容量都有一定限制。下面我们以php脚本语言为例,看看如何动态输出wap页面。
一、设置web服务器
首先你的 web服务器要安装好php,即能处理php脚本程序。其次,为使web服务器能同时识别和处理php、wml、wbmp等文件,web 服务器的mime表需添加以下的几种文件类型。
text/vnd.wap.wml .wml
image/vnd.wap.wbmp .wbmp
application/vnd.wap.wmlc .wmlc
text/vnd.wap.wmls.wmls
application/vnd.wap.wmlsc .wmlsc
二、用php输出简单动态wap页面
下面有一个最简单的php生成wap页面的例子。注意由于需要php解释器来解释该程序,并输出wap页面,因此所有类似程序应以.php为扩展名。
<?php
header(″content-type: text/vnd.wap.wml″);
echo (″<wml> <card> <p>″);
echo date( ″l ds of f y h:i:s a″ );
echo (″</p></card></wml>″);
?>
该例子在wap手机模拟器中可以浏览,输出当前日期时间,而在普通的浏览器中无法识别,甚至会被认为是错误下载。这是因为在程序开头就声明了该输出文档为wml类型,该类型只有wap设备能够识别并解释。值得注意的是,我们常见的html语言对规范性要求不严,大多数浏览器能“容忍”其中相当多的编写错误,而wml规范相当严格,一点失误都可能导致无法输出所需页面。
一旦我们知道了用php脚本输出wap页面的标准过程,我们就能够使用php强大的功能配合以wml语言的交互处理以及wml script的简单脚本,开发出适合我们需要的应用系统了。
三、用php动态生成图像
wap应用使用一种特殊黑白的图像格式wbmp。我们可以用一些工具来将已有图像转换成wbmp格式,然后在wml文档中使用。但是在wap站点上如果能动态地生成所需图像如k线图等,将会有广阔的应用前景。幸运的是,php的gd库(版本1.8以上)已经提供了相应函数。
<?php
header(″content-type: image/vnd.wap.wbmp″);
sim = imagecreate(50, 50);
swhite = imagecolorallocate(sim,255,255,255);
sblack = imagecolorallocate(sim,0,0,0);
imagerectangle(sim, 5, 5, 20, 20, sblack);
imagewbmp(sim); imagedestroy(sim);
?>
该文件将在wap模拟器中显示一个黑色矩形框。注意要使用gd的图像函数库,必须在php配置中加载php_gd.dll库文件。
四、在php中处理汉字
wap作为一种全球应用,选择了unicode 2.0作为其标准字符集编码,以便能同时处理包括英文、中文、日文、法文等多种文字。而我们平常处理汉字使用的是gb2312编码,不同的内码标准势必不能通用,因此如果不在两种编码之间通过码表进行转换,就会出现汉字乱码现象。现在已经有较成熟的gb-2312与unicode编码转换的程序和函数,并在asp、php、jsp等系统中使用,我们可以在一些技术站点上找到它们。
目前的大多数wap手机(nokia7110、爱立信r320s等等)都是使用utf-8编码的,也就是采用unicode来编码。这样,如果我们直接在wml使用中文字符(gb2312编码),将会产生乱码,手机用户无法识别,所以我们在输出中文之前,要使用程序或函数对中文进行unicode的编码。而在少数支持gb2312编码的手机或wap终端设备中,我们可以在程序中定义好文档的内码类型后即可直接正确显示汉字,例如:
<?php
header(″content-type: text/vnd.wap.wml; charset=gb2312″);
echo (″<wml><card><p>″);
echo (″中文测试″);
echo (″</p></card></wml>″);
?>