VB中实现ASP中Server.URLEncode与Server.URLDecode

原创 2007年09月25日 17:17:00

  HTTP协议中,浏览器不能向服务器直接传递某些特殊字符,就必须对这些字符进行URL编码再传送。

 
 浏览器一般会以UTF-8ANSI(当前系统语言设置)两种方式发送URL到服务器。
 
 例如:
 
 baidu中搜索中国的结果:http://www.baidu.com/s?wd=%D6%D0%B9%FA&cl=3。即[中国]被解析成:%D6%D0%B9%FA
 
 google中搜索中国的结果:http://www.google.com/search?hl=en&q=%E4%B8%AD%E5%9B%BD。即[中国]被解析成%E4%B8%AD%E5%9B%BD
 
 分析两个页面源代码。baidu使用的charset=gb2312字符集,即ANSI编码。google使用的是charset=UTF-8字符集,即UTF-8进行编码。
 
 编码的规则:
  1、空格转换成为"+"
 20~9,a~z,A~z字符表示不变。
 3、其他字符编码在以十六进制格式表示,并在每个十六进制字节上加上[%]
 
[email:admin@xx.com * 中国]进行编码,在baidu搜索中验证结果为:http://www.baidu.com/s?wd=email%3Aadmin@xx.com+*+%D6%D0%B9%FA&cl=3
 
ASP中间对Url的编码解码可以使用Server.URLEncodeServer.UrlDecode来完成。
 
如何在VB中间也实现URLEncodeUrlDecode
 
[中国]编码,结果为:%D6%D0%B9%FA
 
'利用Ascii转换16进位制
Private Sub cmdEncode_Click()
    
Dim i As Integer
    
Dim strChar As String
    
Dim strMsg As String
    
Dim strText As String

    strMsg 
= "中国"
    
For i = 1 To Len(strMsg)
        strText 
= strText & "%" & Left(Hex(Asc(Mid(strMsg, i, 1))), 2& "%" & Right(Hex(Asc(Mid(strMsg, i, 1))), 2)
    
Next
    Debug.Print strText
End Sub
'利用strConv转换当前页码处理
Private Sub cmdEncode_Click()
    
Dim strMsg As String
    
Dim a() As Byte
    
Dim i As Integer
    
Dim strText As String

    strMsg 
= "中国"
    a() 
= StrConv(strMsg, vbFromUnicode) 

    
For i = LBound(a) To UBound(a)
        strText 
= strText & "%" & Right("00" & Hex(a(i)), 2)
    
Next

    Debug.Print strText
End Sub
 
[%D6%D0%B9%FA]解码,结果为:[中国]
'按Ascii进行解码
Private Sub cmdDecode_Click()
    
Dim strText As String
    
Dim strMsg As String
    
Dim strChar As String

    
Dim i As Integer

    strText 
= "%D6%D0%B9%FA"

    
For i = 1 To Len(strText)
        strChar 
= Mid(strText, i, 1)
        
If strChar = "%" Then
            strMsg 
= strMsg & Chr(Val("&H" & Mid(strText, i + 12& Mid(strText, i + 42)))
            i 
= i + 5
        
End If
    
Next
    Debug.Print strMsg
End Sub

'以strConv进行当前页面解码
Private Sub cmdDecode_Click()

    
Dim i As Long
    
Dim a() As Byte, vTemp As Variant
    
Dim strText As String
    
Dim strMsg As String

    strText 
= "%D6%D0%B9%FA"

    vTemp 
= Split(strText, "%")

    
ReDim a(UBound(vTemp) - 1As Byte
    
    
For i = LBound(vTemp) + 1 To UBound(vTemp)
        a(i 
- 1= Val("&h" & vTemp(i))
    
Next

    strMsg 
= StrConv(a, vbUnicode)

    Debug.Print strMsg
End Sub
按以上规则在VB中实现URLEncodeANSI编码方式
'进行UrlEncode编码(ANSI)
Private Function UrlEncode(strUrl As StringAs String
    
Dim i As Integer, j As Integer
    
Dim a() As Byte
    
Dim strChar As String
    
Dim strText As String
    strText 
= ""

    
For i = 1 To Len(strUrl)

        strChar 
= Mid(strUrl, i, 1)
        
Select Case Asc(strChar)

            
'48 to 57代表0~9;65 to 90代表A~Z;97 to 122代表a~z
            '42代表*;46代表.;64代表@;45代表-;95代表_ 此点在文最后做出说明
          Case 48 To 5765 To 9097 To 1224245466495
            strText 
= strText & strChar

            
'空格转换成 "+", 注意的"+"会转换成"%2B"
          Case 32
            strText 
= strText & "+"

            
'其他字符正常转换成十六进制
          Case Else
            
'转换成为缺省页码
            a = StrConv(strChar, vbFromUnicode)
            
For j = LBound(a) To UBound(a)
                strText 
= strText & "%" & Right("00" & Hex(a(j)), 2)
            
Next

            
Erase a()
        
End Select

    
Next
    UrlEncode 
= strText
End Function

运行:Debug.Print UrlEncode("email:admin@xx.com * 中国")

结果: email%3Aadmin@xx.com+*+%D6%D0%B9%FA

'进行UrlEncode解码(ANSI)
Public Function UrlDecode(strUrl As StringAs String
    
Dim strChar As String
    
Dim strText As String
    
Dim strTemp As String
    
Dim strRet As String
    
Dim LngNum As Long

    
Dim i As Integer

    
For i = 1 To Len(strUrl)

        strChar 
= Mid(strUrl, i, 1)

        
Select Case strChar
          
Case "+"
            strText 
= strText & " "
          
Case "%"
            strTemp 
= Mid(strUrl, i + 12'暂时取2位

            LngNum 
= Val("&H" & strTemp)

            
'>127即为汉字
            If LngNum < 128 Then
                strRet 
= Chr(LngNum)
                i 
= i + 2
            
Else
                strTemp 
= strTemp & Mid(strUrl, i + 42)
                strRet 
= Chr(Val("&H" & strTemp))
                i 
= i + 5
            
End If
            strText 
= strText & strRet

          
Case Else
            strText 
= strText & strChar
        
End Select
    
Next

    UrlDecode 
= strText
End Function

运行:Debug.Print UrlDecode("email%3Aadmin@xx.com+*+%D6%D0%B9%FA")

结果:email:admin@xx.com * 中国

需要注意的几点:

1、网络中通常会说CBK,GB2312,JIS,BIG5是字符集,而字符的储存方式叫作编码。各个国家和地区在制定编码标准的时候,“字符的集合”和“编码”一般都是同时制定的。因此,平常我们所说的“字符集”,同时也包含了“编码”的含义。

 

2、如果直接在IE地址栏输入:http://www.baidu.com/s?wd=中国是可以访问的,但是换作Opera浏览器则会错误。这是由于不同浏览器识对客户端的URL编码不同造成。具体可参考:浏览器发送URL的编码特性

 

3、在本段在URLEncode中加入对[*],[.],[@],[-],[-]的判断。主要是显示编码以后地址栏URL的结果,如baidu搜索中admin@xx.com会依旧会解吸成为admin@xx.com.

  但是地址栏的URL并不代表发送到服务器的URL ,发送到服务器的URL实际上已经被编码成为admin%40cnlaunch%2Ecom

 所以如果需要显示成地址栏的结果,可以按以上函数,如果显示大送到服务器的URL编码,可以去掉对这5个字符的Ascii判断即可。

 

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

VB版第三期人物---yoki

网名:yoki (小马哥--鬓微霜,又何妨)来源:大抵是看多《上海滩》职务和荣誉:VB版原数据库斑竹,多次的MS社区之星,因此A了很多免费书,哈哈,羡慕ing~照片:http://blog.csdn....

VB版人物---第一期:TechnoFantasy

伪CIA档案之----TechnoFantasy网名:TechnoFantasy(冰儿马甲www.applevb.com)网名来源:applevb是他的小站,很有名哦,在TW看见著名的小纪站长也是推荐...

VB中使用DOM写XML文件

整理以前旧问题,原帖地址:http://topic.csdn.net/t/20050628/16/4110312.html1、建立字符串写文件,XML是由组成,实际上把所有字符形成后再写进文件中即可。...

VB版人物---第四期:online(龙卷风)

乐与怒前两年,精心写的那篇文章送给了那个离我远去的女孩。今天,我却又要提笔来写,写我自己。为了纪念这四年的程序生涯。时间追溯到了2000年,毕业了,学校没有给我们一丝喘息机会,一脚把我们揣进了社会这个...

RAS算法

From:watercloud (watercloud_at_xfocus.org)RSA算法基础->实践讲讲自己学习RSA中的实践过程,已经对RSA熟悉的看家就不用在此浪费时间了。基础RSA算法非常...

编码URLEncoder和解码URLDecoder的UTF-8到GBK的转码

package com.kk; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import j...

VB的URLEncode函数

Public Function URLEncode(ByVal strParameter As String) As String Dim s As String Dim I As Int...

Server.UrlEncode与HttpUtility.UrlDecode使用

在对URL进行编码时,该用哪一个?这两都使用上有什么区别吗? 测试: string file="文件上(传)篇.doc"; string Server_UrlEncode=Server.UrlE...

urlencode urldecode实现

  • 2013-03-21 16:38
  • 62KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)