第一格式化html数据
这里首先涉及的是在一个HTML网页中如何显示HTML代码的方法
字符与等价的HTML实体的关系
< &
>
如果我们在输出流中直接使用< >这些标签是无法在浏览器上明文显示的
等等~~ 我们在需要的时候必须对他们进行转换即Server对象的HTMLEncode方法
ResponseWrite ServerHTMLEncode (& QUOT & strvalue & QUOT & ) returned
…
现在所能做的就是把HTMLEncode方法应用于正在输出的值上
…
strResult = ServerHTMLEncode(strvalue)
ResponseWrite ServerHTMLEncode ( & QUOT & strResult & QUOT & ) returned
从HTMLEncode方法本身考虑
This is <B>bold</B> text
上面的语句在HTML网页中得不到同样的显示结果这是因为HTML字符实体将被浏览器处理和执行并显示为实体所替代的字符换句话说得到的是
This is <B>bold</B> text
我们没有看到实体为了避免这种情况可两次使用ServerHTMLEncode方法这就把&号变换为&这样就得到了所需的显示结果示例网页的这个部分的代码是
If Len(RequestForm(cmdHTMLEncode)) Then
strvalue = RequestForm(txtHTMLEncode) Get the value from the text box
strResult = ServerHTMLEncode(strvalue) HTMLEncode to convert <> and
strDisplay = ServerHTMLEncode(strResult) Then again to convert & to &
ResponseWrite <B>Results:</B><BR>ServerHTMLEncode ( & QUOT & strResult _
& QUOT & ) returned <B> & QUOT & strDisplay & QUOT _
& </B><HR>
End If
HTMLEncode与HTML控件的缺省值
从上面可以看出如果在一个HTML网页中要显示HTML代码而又不使之被作为HTML进行处理和执行HTMLEncode方法是非常有用的在大多数普通的ASP网页中不大可能会遇到这种情况除非使用包含有HTML的数据库或其他数据源中的数据而又需要作为文本进行显示
但是HTMLEncode方法真正有用的地方是通过设置value属性预设页面中文本类型的HTML控件的值作为例子可看一下已经用于练习HTMLEncode方法的示例网页的源程序创建HTMLEncode对应的文本框的HTML在HTML页中定义如下
…
<INPUT TYPE=TEXT NAME=txtHTMLEncode SIZE=
value=This is <B>bold</B> text>
…
这是手工编码而不是使用ServerHTMLEncode方法这里也只关心对双引号进行编码而不关心对尖括号的编码为什么?这是因为如果没有这样做该代码将被读为
value=This is <B>bold</B> text
而在这种情况中尖括号不会带来问题未编码的双引号则会在文本框中替换的实际值将是This is <B>即它将在第二个双引号字符处被截断所以在创建预置控件值的页面时应该考虑使用HTMLEncode方法以避免这些值被截断
<%
strvalue = RequestForm(txtSomevalue)
%>
…
<INPUT TYPE=TEXT NAME=txtSomevalue
value=<% = ServerEncode(strvalue) %>>
…
当浏览器发送已经被HTML编码的一个控件的值给服务器时自动进行反向译码即服务器使用Request集合中原来格式的数据
第二 格式化UTL的数据
还有另外一种情况就是经常需要把一个文本字符串变换成能够在Web网页中使用的另外一种格式现代Web服务器和操作系统都十分友好地支持包含空格字符的文件名但是我们所使用的URL可能包含有空格字符由于HTTP使用的URL语法不允许有空格字符(和几个其他字符)可能会出现麻烦
另外一种更普遍的情况也会出现麻烦当把这些值作为QueryString集合的成员传送给服务器时将被追加到URL的末尾(在一个问号字符之后)这种情况发生在<FORM>的METHOD属性被设置为GET(或者是省略了METHOD属性)的情况换句话说对于直接追加到URL上的值都可能出现麻烦这可能发生在<A>元素中
<A HREF=?title=Instant Jscript>Instant Jscript</A>
一些浏览器(例如Internet Explorer)可以对此进行处理因为它们在把HTTP请求发送到服务器之前自动地执行必要的转换然而许多其他的浏览器不进行这种转换并导致了URL通常在第一个空格或非法字符处被截断这样在Navigator中上面给出的链接要求的网页变为?title=Instant在服务器上title名字/值对的丢失部分会使代码失败
考虑到HTTP协议定义的限制必须从作为HTTP请求中的URL使用的字符串中删除非法的字符(非法字符是所有那些ANSI代码在之上的字符和ANSI代码在以下的某些字符)
ANSI代码大于的字符必须用百分号后跟十六进制形式的ANSI代码进行替换这样版权字符?变成%AANSI代码在之下在URL中不合法的字符同样使用相应的替代字符串
表 字符与HTTP/URL代替物的关系
空格 +
%C
%
] :%D
! :%
^ :%E
# :%
` :%
$ :%
{ :%B
% :%
| :%C
& :%
} :%D
( :%
+ :%B
) :%
< :%C
/ :%F
= :%D
: :%A
> :%E
; :%B
Chr() :忽略
] :%B
Chr() :%D
Server对象提供了可以用来把任意字符串转换成相应的合法HTTP URL的方法
If Len(RequestForm(cmdURLEncode)) Then
strvalue = RequestForm(txtURLEncode)
ResponseWrite <B>Results:</B><BR>ServerURLEncode ( & QUOT & strvalue _
& QUOT & ) returned <B> & QUOT & ServerURLEncode(strvalue) _
& QUOT & </B><HR>
End If
对HTML元素和其他链接使用URLEncode
URLEncode方法更普遍地用于把<A>元素或其他链接的值写到ASP网页例如如果在查询字符串中建立了一系列的链接这些链接包含来自一个数据库的值首先应该对这个字符串使用ServerURLEncode方法
<%
strvalue = RequestForm(txtSomevalue)
Create the full URL for the link as an HTTPlegal string
strURL = ?title= & ServerURLEncode(strvalue)
Make sure we dont have any nonlegal HTML characters in the page text
strLink = ServerHTMLEncode(strvalue)
%>
…
<A HREF=<% = strURL %>><% = strvalue %></A>
…
如果放入字符串strvalue的值包含标题Active Server Pages?将得到由这个代码段创建的如下所示的HTML
<A HREF=?title=Active+Server+Pages%A>
Active Server Pages?</A>
注意我们不仅仅使用ServerURLEncode方法来建立一个合法的URL字符串而且还对链接的文本使用了ServerHTMLEncode方法以确保把所有非法的字符转换为合适的HTML等价实体
和HTMLEncode方法一样不用反译码ASP网页中的URL编码值IIS自动地实现URL编码字符串的转换该字符串在HTTP请求中转换为它们原先格式使得它们在内置对象中是可用的