25
2008
02

WAP常见问题解答

 1. 简单说WML代表什么?
    WML代表“Wireless Markup Language”。WML就是无线标记语言(Wireless Markup Language),内置于移动设备中的微型浏览器能够解释这种标记语言。虽然它和HTML语言很相像,但WML其实是XML的一个应用子集。
2. 什么是WML?
    WML代表Wireless Markup Language,就象HTML对普通的Web浏览器一样。有人说它是基于XML,但是更准确地说WML是XML的一个应用。虽然在语法上和HTML相似,但更多的是XML。如果准备从HTML到WML,但是没有任何的XML知识,将会发现WML“非常”严格。就像HTML,WML被读取并且通过WAP设备中的浏览器解释,然后显示在屏幕上。对于WAP设备,浏览器,或者用户代理,通常叫做微型浏览器。微型浏览器的功能是受到WAP设备的限制的。
    为什么使用WML而不是使用广泛的HTML原因是由于WAP的工作方式以及WAP是为一个“窄小”的无线世界工作的。在Netscape、Opera或者IE上显示HTML需要更强的计算能力。计算能力某种意义上是移动设备中的电能。由于移动设备中的电能是有限的,所以WML在发送给WAP设备之前,通常要经过转换和压缩。所以WAP使用的是WML。
    读者也许可能想到WML非常简单,甚至不能处理HTML中的多媒体类型。这个不是问题。标记语言(WML、HTML等等)没有操作设备的权限,例如播放声音或者显示动画。仔细地观察HTML,就会发现没有一个HTML标签能够显示动画或者播放音乐。限制是来自于运行标记语言的浏览器。毕竟在大多数情况下,是谈论移动电话。但是这个限制应该随着无线Internet的发展而逐渐取消。
3. WML与HTML有什么区别?
    虽然WML看起来十分像HTML,但是在技术上两者的差别还是很大的。WML是为微型浏览器所设计的HTML的一个子集。WML的标准定义是基于XML的。
4. Phone.com的 HDML和WML有什么区别?现在有电话支持 HDML吗?
    HDML(Hand-held Devices Markup Language)是Phone.com开发的。它使得Web页面可以在移动电话上显示,其标准的公布先于WAP标准。Motorola、 Neopoint、Qualcomm 等等公司的电话使用Phone.com的浏览器,它支持HDML。最新的UP.Browser支持HDML和WAP。
5. 为什么使用WML而不是HTML?
    首先是WAP协议要求使用WML。可能已经有能够支持HTML的WAP设备,但是那不是真正的。有一些和无线设备很像的WAP设备支持HTML,但它们也不是直接使用HTML(例如:Microsoft Mobile Explorer支持HTML和WML)。MME设备只是将两个分离的部分做到了一起。当然也有HTML的变种,例如 iMode 浏览器使用Compact HTML。简单的说,如果谈论WAP设备,那么标记语言就是WML。
    有很多理由说明选择WML而不是HTML。现在最重要的一个原因就是WML与HTML相比需要很小的带宽。随着无线技术的提高,带宽会越来越宽。这个原因可能不再是主要原因,但是在达到这么高带宽之前需要许多年的时间。
    另外一个就是HTML需要相对来说比较强的处理器。处理器的能力意味着需要更强的能量。在无线设备中能量来自于电池。而一个低处理能力的处理器就意味着电池的使用时间可以更长。
    另外,HTML的确需要一个很大的显示屏幕。移动电话上的屏幕显然不能满足要求。当然也许会有一个大屏幕的移动电话,但是这样它就离移动更远(也就是说越不像移动电话)。即使iMode支持彩色和一个类似HTML的显示,它的尺寸已经是你可以方便携带的最大尺寸。
6. 为什么对于无线设备要专门设计一种特别的语言才能访问Internet ?
    许多年来,HTML标记越来越丰富,越来越庞大。此外,浏览器对各种HTML标记的支持也大不相同。这种状况已经与当初想建立一个简单的标准相背离。
    移动设备(例如:移动电话)具有小屏幕、内存少、缺少方便的输入设备和带宽窄的特点。这种状况驱使WAP讨论组发展一种新的为无线设备所使用的语言,WML就此诞生了。
7. 无线设备也能支持HTML格式吗?
    从技术的角度上来说答案是肯定的。既然HTML是为普通PC浏览器所编写的,也可以使用微型浏览器来浏览一个HTML页面,但是可能没有效果。因为移动电话不知道如何显示该文件。这样通常导致微型浏览器出现混乱。并且HTML页面通常都比较大,它会把移动设备“撑坏”的。
8. 如何将HTML转换成WML?
    当考虑转换HTML时,要想到WML是为小屏幕设计的,不可能像HTML那么丰富多采。任何转换都将忽略很多HTML标记和许多内嵌的脚本。只有一些简单的HTML页面可以被满意地转换。转换可以使用工具包如:Spyglass Prism,也可以通过在线的WAP网关过滤。
9. 用什么可以浏览到WML页面?
    首先需要一个具有WAP功能的手机,例如:Nokia 71110,Ericsson R320等等。用于PC机的桌面WML浏览器也很多,例如:WinWap、WapMan等等。
10. 在哪里可以学到更多的关于XML的知识?
    可以访问站点:www.w3c.org/xml。在该网站上有许多关于XML的知识有详细的讲解。
11. WML的一般语法是什么?
    WML非常像XML。和HTML相比其语法规则更加严格,从而保证当微型浏览器解析和解释的时候不会有太多的错误信息。
    和HTML一样,WML使用“<”和“>”组成的格式化标签。许多标签都是以开头,以结尾。在开头或者结尾中包含的部分叫做元素。有些标签叫做空元素,只有标签,没有内容,如:
    许多元素有属性来描述应其中还有那些内容。属性名字必须小写,并且属性值必须使用双引号括起来。有些属性是必须的,有些是可选的。一般的属性标签格式就像:
    变量可以在WML卡片中定义,它们的一般格式是 $(variablename)。
    一个WML页面有一个专门的格式,它必须以XML的文档声明为开头:

<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM/DTD WML 1.1//EN" "
http://www.wapforum.org/DTD/wml_1.1.xml">

    所有的页面中的元素,都必须在标签之间。
12. 什么是一个“deck”?
    一个WML文档有许多卡片(cards)组成。一个卡片是一系列完整的WML代码。这些卡片被称为一个“deck”。卡片和“deck”的概念就有点像HTML中的锚标记和一个HTML页面。也就是说卡片是“deck”中的一个组成部分。也可以把“deck”称为WML中的页面。它们之间的关系可以比做一副扑克牌。整副扑克牌就是deck,而每一张牌就是card。
13. 什么是WML的“deck”?
    WML的“deck”或者WML文件是指decks。每个deck包含一个或者更多的card。每个deck都以开始和结束。并且每个card都以开头或者结束。
    当WML微型浏览器处理WML文件或者deck的时候,它阅读整个deck,并且在deck内的各个card之间进行导航。当装入deck的时候,deck里面所有的card都已经装入到内存中,直到浏览器装入另外的deck。
    如果熟悉 HTML中的
标签。WML的标签将是非常类似的:

<wml>

<card id="start_menu">
...some code...
</card>

<card id="purchase">
...some more code...
</card>

</wml>

    deck和card可以按照这种方式调用:[deckname][#cardname]。如果deckname省略,那么浏览器就会查找当前内存里的cardname名字的card。如果使用了deckname和#cardname,那么浏览器将装入deckname的整个deck,然后跳入到#cardname。这个和HTML的工作方式很像。
14. WML是大小写敏感的吗?
    是的!要注意WAP 1.1使用小写的标签。
15. 如何显示一个美元符号?
    使用两个在一起的美元符号来表示,即“$$”。
16. 想显示价格的格式该怎么办?
    “$”是一个特殊的字符,使用“$$”来显示一个“$”。
    例如:

<p>
    The price is $$11.20
</p>

17. fieldset标签有什么作用?
    编写WML页面的时候要考虑到设备的屏幕很小。如果试图想把一个大的form在一个屏幕里面显示,就要指定那些标签保持在一个屏幕中。那么fieldset标签将这些标签捆绑在一个屏幕上。
18. postfield标签有什么作用?
    postfield标签使允许提交参数到服务器端。注意有些早期的模拟器还不支持该标签,这将给开发工作带来麻烦!
19. WML有类似HTML的<mailto>标签吗?
    没有。但是你可以使用WML表单和服务端脚本来得到同样的效果。
20. 无法让<input/>格式正常工作是怎么回事?
    至少Nokia WML Reference没有讲清楚有关<input/>标签的用法。format参数控制着用户输入数据的类型和长度。
    注意到不是所有的WAP 1.1浏览器都接受所有的格式化代码。例如:Nokia 7110就支持得不是很好。Mitsubishi Trium在处理“*f”代码的时候有点问题,“*”必须为1或者更大。专门的格式化代码如下:
A
从A到Z的任何大写字母,没有数字或其他字符。
a
从a到z的任何小写字母,没有数字和其他字符。
N
任何0到9的数字。
X
从A到Z从0到9的任何字符。
x
从a到z从0到9的任何字符。
M
任何字符,输入默认从大写开始。
m
任何字符,输入默认从小写开始。
*f
(星号)意味着任何数字(包括0),f是格式的代码。
nf
意味着恰好要输入的字符个数。n从1到9。f是格式代码。
\
是转义输出字符。
    格式化字符可以组合使用来表示一种特定的格式输入。但是强制一定的输入应当避免在用户出错的时候没有提示信息。如果输入是不正确的,该填写的区域一般仍保持空白,直到让用户知道应该输入什么。如果只想输入数字,使用“*N”那么将直接转跳到数字输入模式。如果只想输入大写的字符,使用“*M”转跳到大写输入模式。现举一些例子:
    “N” 只接受一个数字字符。
    “*N” 接受任何数字字符。
    “NN” 只接受2个数字字符,不多不少。
    “ANN” 接受一个大写字符(没有数字),后面跟着两个数字,不多不少。
    “X*N” 表示可以接受一个字符(没有数字)后面跟着任意多的数字字符。
    “NNN\-NNN\-NNNN”表示接受美国的电话号码格式,例如:“123-456-1234”。
    “2N\:2N\:2N” 表示接受时间格式,例如:“12:02:34”。
    “NNNNNNNNN” 表示接受9个数字字符。
    “9N” 同样表示接受9个数字字符。
    maxlength参数控制着输入字符的总个数。
21. 如何防止一个空的field?
    在大多数情况下需要知道用户确实是输入了一些内容在field中,不能让这些内容为空。这个可以通过在服务端的检测来完成,也可以通过WML来完成。
    在WML中,这个检查可以通过合适的格式化代码来完成,或者使用一个在input标签中叫做emptyok="false" 的参数来实现(只有当必须要求用户输入的时候才使用)。如果使用了value="something" 或者value="" 用户仍然可以发送空的fields。
    以下的行将接收任何值到username field, 甚至用户将整个field清空。另外field中没有任何东西,也能够提交form。
        <input name="username" type="text" value="things" format="*M"/> 
    除了用户将整个field清空,以下的行将接收任何值到username field。如果field是空的,他将不能提交form,。
        <input name="username" type="text" value="things" format="M*m"/>
    以上的应用是针对大多数的浏览器。在Nokia 7110 ,emptyok参数可以有同样的效果:
        <input name="username" type="text" value="things" format="*M" emptyok="false"/>
22. 使用option标签的时候,无法一屏显示完该怎么办?
    许多WAP电话的显示屏幕只能显示三到四个选项。按以下的方法分割option字段就可以输入更多的选项。

<select title="longselectlist">
<optgroup title="option1">
<option>option1-1</option>
<option>option1-2</option>
<option>option1-3</option>
</optgroup>
<optgroup title="option2">
    <option>option2-1</option>
      <option>option2-2</option>
      <option>option2-3</option>
</optgroup>
<optgroup title="option3">
      <option>option3-1</option>
      <option>option3-2</option>
      <option>option3-3</option>
</optgroup>
</select>

23. 想有一个永久的BACK在屏幕的右下方。有些好像是自动的,若没有,该怎么做?
    可以加入以下代码。
<do type="prev" label="Back">
    </prev>
</do>
[/code]
更好的是使用template。
[code]
<template>
    <do type="prev" label="Back" name="back">
        </prev>
    </do>
</template>

24. WAP支持列表吗?
    是的,WAP1.1支持列表和相关的标记。
25. 可以在WML中使用表单吗?
    可以。但是Nokia 7110在显示表单的时候有些问题。
26. WML支持什么样的表单提交方式?
    WML支持GET和POST方式。但是Nokia 7110在处理GET方式的时候有些问题。
27. WML中如何增加参数到URL字符串中?
    和HTML的工作方式很像,如下所示:
……
www.someserver.com/someurl?parameter1=value1¶meter2=value2
……
    唯一的不同是将“&”变成“&”。
28. 如何从WML向ASP传送数据?
    假设有一个ASP叫做“myasp.asp”,并且有一个WML变量叫做 “wmlvar”。当发出请求“myasp.asp?wmlvar=something”,可以使用下面的方法得到变量的内容。
    dim aspvar
    aspvar = Request.QueryString("wmlvar") 

    ASP变量“aspvar”将包含字符串“something”。当然ASP变量也可以与WML变量同名。
29. 如何让WML页面自己更新?
    有过Web经验的人喜欢使用:
        <meta http-equiv="refresh" content="1;http://somewhere.com/"> 
    来强制浏览器自动更新。
    虽然在WAP中也支持一些META标签,一个更好的办法是使用<ontimer>标签。
    以下的代码显示了如何自动转跳到另外一个卡片:nextdeck.wml。

<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
    <card id="splashscreen" ontimer="nextcard.wml">
      <timer value="40"/>
      <p>Please wait for the timer to run out...</p>
    </card>
</wml>

下面的代码将强制浏览器在一段时间后重新装入同一个卡片。这个页面叫做loop.wml。
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "
http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
    <card id="loop" ontimer="loop.wml">
      <timer value="40"/>
      <p>This text will be shown over and over again...</p>
    </card>
</wml>

    注意必须避免浏览器可能要使用的cache机制。
30. WML页面的最大大小是多少?
    1397 bytes/deck
31. WML页面的限制是多少?
    由于WAP设备只有很少的内存,因此就存在着一个最大的WML deck的界限。这里没有一个绝对的标准,根据浏览器的不同而不同。表10-5列出了几种浏览器的限制。
    注意WML deck的大小是指编码压缩成二进制格式下的大小,一个没有压缩的WML deck可能很大,但是压缩后可能比较小。
不同浏览器的限制

UP.Browser 3.2    1492 bytes      
UP.Browser 4.x    2048 bytes      
Ericsson R320    大约3000 bytes      
Ericsson R380    大约3500 bytes      
Ericsson MC218    多于8000 bytes      
Nokia 7110    1397 bytes    

32. 如何防止对WML页面的非法访问?
    WAP可以防止通过HTTP协议对文件和目录的非法操作。注意:有些WAP模拟器和虚拟的WAP浏览器可能不支持这个特点。在这个时候是不知道是否有可能使用其他类型的验证方式。
    为了使用这种方式,用户的HTTP服务器必须支持这个特点,其实大多数服务器都支持。当一个WAP浏览器请求一个URL,它将提醒用户输入用户名和密码。这些都转换成无法直接阅读的字符,但不是加密。也就是说如果网络上有人在使用合适的设备监听,那么用户名和密码将被泄露。
    这个特点在Apache文档中有详细的说明,但是文档的描述很弱,这里有如何在Apache HTTP服务器上配置的说明:
    要保证Apache已经配置过,使得一个名叫.htaccess的文件可以覆盖全局的操作配置。操作配置既可以在每个目录使用分离的文件,也可以在全局的access.conf中。但是在这个例子中,我们将集中在.htaccess文件上。并且检查AllowOverride的设置。这个必须设置到AuthConfig,那样意味着Apache在目录中寻找.htaccess文件,并且使用该文件中的规则。记住在配置后要重新启动Apache服务器。
    下一步是在目录里放置需要保护的文件叫做.htaccess。(注意点代表文件名的开头)。一个.htaccess文件的基本内容如下:
AuthType Basic
AuthName "WAP FAQ Authentication Demo"
AuthUserFile /home/httpd/html/wap-faq/extras/auth/auth.passwd
require valid-user 
    AuthType设置是指定验证的类型,AuthName指定领域,AuthUserFile指定口令文件的位置,require指定所想得到的操作。在这个例子中,任何在口令文件中的用户都有一个正确的口令。
    现在需要产生一个口令文件,Apache使用一个叫做 .htpasswd来完成这个特殊格式文件的生成。运行程序如下:
#htpasswd /home/httpd/html/wap-faq/extras/auth/auth.passwd demo
New password:
Re-type password:
Adding password for user demo
    注意:在第一次创建文件的时候,必须使用“-c”选项。
    现在加入了一个叫做“demo”的用户,并且输入了他的密码两次。考虑到安全的原因,口令文件不应该放在文件根目录下。笔者在这里只是做演示。
    现在最后就是测试,笔者建议使用HTML浏览器。输入含有想保护的URL目录的地址,一个对话框就会弹出来询问用户名和口令。如果一切顺利,就可以使用WAP浏览器来测试了。
    一个目录保护的例子在这个服务器上,用户名是demo,口令是demo。可以使用HTML或者WML浏览器来做测试。
    这个例子同样可以通过输入http://wap.colorline.no/demos.html来得到。
    或者只要点到保护的区域:
        http://wap.colorline.no/wap-faq/extras/auth/
    或者查看.htaccess文件。
    最后点击查看口令文件的内容。
33. 怎么使用非拉丁字符?
    在文件开头加上:
        encoding="ISO-8859-1"?
    或者:
        encoding="UTF-8"?
    ISO-8859-1和UTF-8编码支持更多的字符。
34. 一些特殊字符破坏了代码和连接该怎么办?
    锚/链接有时候包含了一些字母和数字之外的字符。典型的如:“~”(波浪号)和“&”(与号)。如果根据书编程,就应该告诉WAP浏览器使用的是什么字符集。这个在XML定义中可以完成:
     
    “iso-8859-1”是Latin字符集。这个应该在大多数场合下能满足需要。但是,还是需要对那些转义字符进行转义。即使指定了字符集,也是没有用处的。
    字符实体是某些特殊字符的标准名字,例如:“&”就是“&”。
    大多数浏览器在反编码名字实体的时候会出现问题,例如Nokia列出了7个兼容的名字实体:“quot”、“amp”、“apos”、“lt”、“gt”、“nbsp”和“shy”。只有在使用它们的十进制代码的时候(在上述所说的Link中),浏览器可以显示几乎所有字符。如果Nokia的浏览器接收到无法支持的实体名,它就会崩溃。
    通过使用HTML或者WML浏览器(在HTML格式下,虽然不是很好),可以操作在线的实体名列表,该列表在http://wap.colorline.no/wap-faq/apps/charentref.html。
    这个表同样有一个例子在:http://wap.colorline.no/demos.html。
    第一步,选择将要使用的字符集,Latin1,Latin1 Mathematical和Greek symbols,最后是Latin1 Markup symbols。注意到列表被分割了,是由于deck的限制。真正的列表显示了实体名,实体的十进制值和真正的符号。从这里就可以看到哪个字符浏览器可以显示。
    注意上面的在线列表,不要设置为“charset=iso-8859-1”(真正的Latin1),那是个XML定义。
35. 可能在WML页面上显示一个可选的Link吗?当用户选择后就可以直接拨号?
现在不行。但是一旦支持WTAI的设备出现,那么就可能实现。

« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。