url会把一些特殊的字符例如#()%@&^转换成这样%23%28%29%25@%26%5E的编码,请问是根据什么算法转换的,有没有源代码,或者给出算法也可以,谢谢

解决方案 »

  1.   

    url会把一些特殊的字符例如#()%@&^转换成这样%23%28%29%25@%26%5E的编码,请问是根据什么算法转换的,有没有源代码,或者给出算法也可以,谢谢不知道你指的url是具体指什么。
    但是我想这一功能够用字符串替换功能来实现。
    思路:查找   替换
              #      %23
               (       %23
    反之亦然。
    用下面的函数来实现这一功能。
    '********************************************
    Public Function StrReplaceA( _
    strMain As String, _
    astrFind, _
    astrReplaceWith)
    '目的 :批量替换字符串
    '相关模块:Replace , GetLBUB
    '输入:StrMain -给定的主串
    '     astrFind() - 查找子串数组
    '    astrReplaceWith() -替换成数组
    '返回:如果操作成功完成,返回0,否则返回Err.Number
    On Error GoTo PROC_ERR
    Dim lngErr As Long
    Dim lngLBOfFind As Long
    Dim lngUBOfFind As Long
    Dim lngLBOfReplace As Long
    Dim lngUBOfReplace As Long
    '判断给定的查找串数组合法性.
    lngErr = GetLBUB(lngLBOfFind, lngUBOfFind, astrFind)
    If lngErr <> 0 Then
       Debug.Print "StrReplaceA. 给定的查找串数组不合法!"
       GoTo PROC_EXIT
    End If
    '***************
    '判断给定的替换数组的合法性
    lngErr = GetLBUB(lngLBOfReplace, lngUBOfReplace, astrReplaceWith)
    If lngErr <> 0 Then
      Debug.Print "StrReplaceA. 给定的替换数组不合法!"
      GoTo PROC_EXIT
      
    End If
    '***************
    '判断查找串和替换串数组的元素个数是否相等
    If lngLBOfFind <> lngLBOfReplace Or _
    lngUBOfFind <> lngUBOfReplace Then
       '指定-1:说明错误发生
       lngErr = -1
       Debug.Print "StrReplaceA. 指定的查找数组和替换数组元素个数不相等"
    End If'***************
    '[通过参数有效性检测,处理正事]
    Dim lngLoop As Long
    Dim strTemp As String
    strTemp = strMainFor lngLoop = lngLBOfFind To lngUBOfFind
        '*关键外部调用:Replace
        strTemp = Replace(strTemp, astrFind(lngLoop), astrReplaceWith(lngLoop))
            
    Next'***************
    '*返回结果
    strMain = strTemp
    PROC_EXIT:
    StrReplaceA = lngErrExit Function
    PROC_ERR:
    lngErr = Err.Number
    Debug.Print "StrReplaceA.Err(" & Err.Number & "):" & Err.Description
    GoTo PROC_EXIT
    End Function
    '********************************************
    '********************************************
    Function GetLBUB(lngLB As Long, lngUB As Long, ParamArray avntParamArray())
    '目的: 得到一个数组的上界和下界
    '相关模块:
    '输入:
    '返回:如果操作成功完成,返回0,否则返回Err.Number
    On Error GoTo PROC_ERR
    Dim lngErr As Long
         lngLB = LBound(avntParamArray(0))
         lngUB = UBound(avntParamArray(0))
         
    PROC_EXIT:
    GetLBUB = lngErrExit Function
    PROC_ERR:
    lngErr = Err.Number
    Debug.Print "GetLBUB.Err(" & Err.Number & "):" & Err.Description
    GoTo PROC_EXIT
    End Function'********************************************'实例说明:#()%@&^转换成这样%23%28%29%25%26
    '注意:我发现这个%比较特殊,因为它在右边也出现了,你必须把%放在查找串的第一位
    dim astrFind,astrReplace,strMain
    '得到你要处理的串
    strMain="this is a test #[email protected]([email protected]()%&^www.softboyzhou.com"
    '*'注意:我发现这个%比较特殊,因为它在右边也出现了,你必须把%放在查找串的第一位
    astrFind=      array("%",    "(",      ")",      "#",   "@",    "&",         "^")
    '下面是我任意写的数字,根据你的详细需要准确填写
    astrReplace=array("%23","%24","%29","%25","%26","%27","%28")
    dim lngErr
    Dim lngErr
    ''*关键外部调用:StrReplaceA
    lngErr = StrReplaceA(strMain, astrFind, astrReplace)
    If lngErr = 0 Then
    MsgBox strMain
    End If'***************
    希望能够对你有所帮助
    '***************'********************************************
    '对不起,放一点广告,对您带来的不便敬请原谅!
    广告:我的第一个Visual Basic 6.0作品,欢迎大家试用,注册用户得到全部源代码。一、EasyDialog能够做什么?
    (为了增强Windows通用打开/保存对话框,能够快速的打开经常访问的文件夹或者文件)
    一、快速地在通用打开/保存对话框中打开你经常访问的文件夹/文件。
    二、快速地在Windows Explorer中打开经常访问的文件夹/文件。
    三、快速地在IE浏览器打开你经常访问的网站。
    四、快速地给你的朋友发Email
    五、能够使您方便地按照逻辑分类来组织和管理您的文件夹/文件,您经常访问的网址,您的Email地址。'********************************************
    '*下载EasyDialog:
    http://www.softboyzhou.com/download/EasyDialog.asp
    '***************
    '*购买EasyDialog:
    http://www.softreg.com.cn/shareware_view.asp?id=/7148D197-1C1D-4E84-B92A-EE2CC07D27C0/
    '***************
    '*给我写信:有什么问题请来信。
    [email protected]
      

  2.   

    谢谢各位了,我找到了
    代码如下,一起分享
    Public Function URLEncode(strInput As String) As String
           Dim strOutput As String
           Dim intAscii As Integer
           Dim i As Integer       For i = 1 To Len(strInput)
               intAscii = Asc(Mid(strInput, i, 1))
               If ((intAscii < 58) And (intAscii > 47)) Or _
                  ((intAscii < 91) And (intAscii > 64)) Or _
                  ((intAscii < 123) And (intAscii > 96)) Then
                   strOutput = strOutput & Chr$(intAscii)
               Else
                   strOutput = strOutput & _
                            IIf(intAscii < 16, "%0", "%") & _
                            Trim$(Hex$(intAscii))
               End If
           Next
           URLEncode = strOutput
       End Function
    一个老外站的,照他代码看"*"这个字符也要转换的,可我截的包这个字符没有转换,不知道怎么回事,残念。