第一格式化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請求中轉換為它們原先格式使得它們在內置對象中是可用的
From:http://tw.wingwit.com/Article/program/net/201311/11927.html