|
作者:佚名 责任编辑:左决 点击数: 更新时间:2008-2-16 6:25:12 |
 |
一般用VB编译生成的CGI程序不能正确处理中文信息。这主要表现在CGI程序向STDOUT输出的中文在WEB页面上无法正确显示,可以通过在该中文字符串后跟着输出一些空格来解决这个问题。当使用HTML标识符〈P〉、〈/P〉对WEB页面进行排版时,浏览器在显示该WEB页面时会吃掉多余的空格而只保留一个,这种情况下这些空格对WEB页面的外观基本没有影响。如果使用HTML标识符〈PRE〉、〈/PRE〉对WEB页面进行排版,由于空格不能被浏览器吃掉,WEB页面的外观将会受到很大的影响。不过这时可以用HTML的表格〈table〉、〈P〉来代替〈PRE〉对WEB页面进行排版。
注意整个CGI程序的主体必须放在MAIN()函数中。
二. URL解码
由于WEB服务器和浏览器对于一些特殊的字符不能正确处理,WEB服务器和浏览器之间可能会由此产生而某种程度的误会,因此在数据被传送之前,浏览器都要对表单内客户输入的数据中的特殊字符进行URL译码。
例如WEB系统用“=”分解表单各元素的NAME和VALUE属性,用“&”分解不同表单元素的输入数据,如果在表单的输入数据中包含这些特殊的字符,并且表单的数据在传送给WEB服务器前不做任何处理,WEB服务器将无法知道哪一个“=”、“&”是用户输入的,哪一个是浏览器加的。在由表单属性ACTION定义的URL中,也可能出现一些特殊的字符,当在CGI程序的名称中和路径信息(Path Information)中出现象“=”、“&”和“?”时,都会影响数据的正确传送。
URL译码(URL Encoding)就是将WEB服务器所不能正确处理的特殊字符转换成它的十六进制数的形式,比如将“%”转换成“%25”、“=”转换成“%3D”等等。这些特殊的字符通常被称为WEB系统的保留字符。通常在WEB系统上不论是用GET方法还是用POST方法传送的数据都要进行URL译码。CGI程序要想处理表单传送来的数据,还必须对浏览器URL译码过的数据进行解码,理解URL译码对对于我们进行CGI编程是非常重要的。一般URL译码的步骤如下:
1. 浏览器将所传送的数据根据表单所包含的元素分解成“NAME=VALUE”的形式,NAME和VALUE分别是表单元素的属性,其中VALUE属性中存储客户方在表单中输入的数据,如果客户方没有输入数据,则VALUE存储的是表单定义的缺省值,如果缺省值也没有定义,则VALUE值为空;
2. 代表表单中各元素的各个“NAME=VALUE”对被浏览器用“&”连接起来;
3. VALUE属性中存放的数据若含有空格,则被转换成“+”;
4. URL和输入数据中所包含的WEB系统的保留字符必须被译码成它们的十六进制数的形式。
5. 被译码后的字符被表示成一个“%”和它们的十六进制数(%HH)。
CGI程序从环境变量“QUERY_STRING”或标准输入中读入的数据是经过浏览器URL译码的,在使用这些数据以前还必须对它们进行URL解码。解码的目的就是将数据还原成客户在WEB页面上输入时的形式。本文已经介绍了URL译码,URL解码和它正相反,一般它有以下的工作要做:
1. 从浏览器用GET或POST方法所传送来的数据中找出代表各个表单元素所储存数据的“NAME=VALUE”对。
2. VALUE属性中存放的数据若含有“+”,则被转换成空格。
3. 将VALUE属性中存放的数据的十六进制数“%HH”转换成相应的字符。
WEB系统将汉字当成特殊的字符,对它也要进行URL译码。对于一个特殊的单字节字符比如“/”,浏览器通常将它译码成十六进制数的形式比如%2F,“%”表示它后面跟的是两位十六进制数。当VB程序对其进行处理时调用Chr$函数就可以将其恢复为原来的面貌。而一个汉字则被浏览器译码成四位十六进制数,比如%D5%C5,如果CGI程序还象以前一样分别调用Chr(D5)和Chr(C5),由于D5、C5都不是正常的单字节十六进制数码,Chr函数返回空,汉字将无法正确还原。正确的作法应该是将有关汉字的四位十六进制数一起传给函数Chr,如Chr(D5C5),此时汉字才能被正确还原。
因此可以让CGI程序对四位连续的十六进制数一起进行译码以使汉字被正确还原。但在这种情况下当客户端用户输入了两个连续的WEB系统保留字符时CGI程序又可能把它们当成汉字来处理。这时可以让CGI程序在需要对四位连续的十六进制数进行译码时首先检查前面两位是否为WEB系统的保留字符,如果是则仍然按照单字节的字符处理。不过如果客户端用户在表单内填写了很多汉字,CGI程序的负担将会大大加重。事实上大多数情况下客户端用户很少会使用两个连续的WEB系统的保留字符,可以只让CGI程序对最容易出现的情形如“://”(当客户端用户在表单中输入某一URL时会出现这种情况)进行检查,本文下节提供的函数UrlDecode( )可以实现对汉字和WEB系统保留字符的URL解码。
三. CGI编程实例
本节将用VB编写一个处理主页客户留言簿的CGI程序。除了本文前面所介绍的Win32API函数,程序中还调用了Win32API函数GetTempFileName()以获得一个唯一的临时文件名。程序中的函数UrlDecode()用来对客户端的输入进行URL译码,函数GetCgiValue()则用来分解字符串,根据表单元素的NAME属性获取其VALUE值,并调用UrlDecode()函数对其进行URL译码。
本程序要求在留言簿文件guests.html中使用一个定位串“〈! ENDHEAD 〉”以将文件的开始部分和具体的客户留言部分分开,CGI程序将在“〈! ENDHEAD 〉”所在的位置插入客户新的留言。guests.html应具有如下的形式:
〈html〉
〈head〉〈title〉DHTML Zone 〈/tITle〉〈/head〉
〈body bgcolor="#FFFFFF" text="#00000" vlink="#990000" link="#333399"〉
〈! ENDHEAD 〉
〈!---客户的留言部分从这开始--〉
〈P〉............................
〈!---客户的留言部分结束于此--〉
〈/body〉〈/html〉 上一页 [1] [2] [3] 下一页 |
|
|
|
|
 |
最进更新 |
|
|
|
 |
推荐文章 |
|
|
|
|