如何在 Excel VBA 中对字符串进行 URL 编码? [英] How can I URL encode a string in Excel VBA?

查看:71
本文介绍了如何在 Excel VBA 中对字符串进行 URL 编码?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否有内置的方法可以在 Excel VBA 中对字符串进行 URL 编码,还是我需要手动滚动此功能?

Is there a built-in way to URL encode a string in Excel VBA or do I need to hand roll this functionality?

推荐答案

不,没有内置(直到 Excel 2013 - 看到这个答案).

No, nothing built-in (until Excel 2013 - see this answer).

这个答案中有三个版本的 URLEncode().

There are three versions of URLEncode() in this answer.

  • 支持 UTF-8 的函数.您可能应该使用这个(或汤姆的替代实现)以与现代要求兼容.
  • 出于参考和教育目的,两个不支持 UTF-8 的函数:
    • 在第三方网站上找到的,按原样包含在内.(这是答案的第一个版本)
    • 我编写的一个优化版本
    • A function with UTF-8 support. You should probably use this one (or the alternative implementation by Tom) for compatibility with modern requirements.
    • For reference and educational purposes, two functions without UTF-8 support:
      • one found on a third party website, included as-is. (This was the first version of the answer)
      • one optimized version of that, written by me

      支持 UTF-8 编码并基于 ADODB.Stream 的变体(包括对项目中Microsoft ActiveX 数据对象"库的最新版本的引用):

      A variant that supports UTF-8 encoding and is based on ADODB.Stream (include a reference to a recent version of the "Microsoft ActiveX Data Objects" library in your project):

      Public Function URLEncode( _
         ByVal StringVal As String, _
         Optional SpaceAsPlus As Boolean = False _
      ) As String
        Dim bytes() As Byte, b As Byte, i As Integer, space As String
      
        If SpaceAsPlus Then space = "+" Else space = "%20"
      
        If Len(StringVal) > 0 Then
          With New ADODB.Stream
            .Mode = adModeReadWrite
            .Type = adTypeText
            .Charset = "UTF-8"
            .Open
            .WriteText StringVal
            .Position = 0
            .Type = adTypeBinary
            .Position = 3 ' skip BOM
            bytes = .Read
          End With
      
          ReDim result(UBound(bytes)) As String
      
          For i = UBound(bytes) To 0 Step -1
            b = bytes(i)
            Select Case b
              Case 97 To 122, 65 To 90, 48 To 57, 45, 46, 95, 126
                result(i) = Chr(b)
              Case 32
                result(i) = space
              Case 0 To 15
                result(i) = "%0" & Hex(b)
              Case Else
                result(i) = "%" & Hex(b)
            End Select
          Next i
      
          URLEncode = Join(result, "")
        End If
      End Function
      

      <小时>

      这个函数是在freevbcode.com上找到的:

      Public Function URLEncode( _
         StringToEncode As String, _
         Optional UsePlusRatherThanHexForSpace As Boolean = False _
      ) As String
      
        Dim TempAns As String
        Dim CurChr As Integer
        CurChr = 1
      
        Do Until CurChr - 1 = Len(StringToEncode)
          Select Case Asc(Mid(StringToEncode, CurChr, 1))
            Case 48 To 57, 65 To 90, 97 To 122
              TempAns = TempAns & Mid(StringToEncode, CurChr, 1)
            Case 32
              If UsePlusRatherThanHexForSpace = True Then
                TempAns = TempAns & "+"
              Else
                TempAns = TempAns & "%" & Hex(32)
              End If
            Case Else
              TempAns = TempAns & "%" & _
                Right("0" & Hex(Asc(Mid(StringToEncode, _
                CurChr, 1))), 2)
          End Select
      
          CurChr = CurChr + 1
        Loop
      
        URLEncode = TempAns
      End Function
      

      我已经纠正了那里的一个小错误.

      我会使用上述更高效(约 2 倍)的版本:

      I would use more efficient (~2× as fast) version of the above:

      Public Function URLEncode( _
         StringVal As String, _
         Optional SpaceAsPlus As Boolean = False _
      ) As String
      
        Dim StringLen As Long: StringLen = Len(StringVal)
      
        If StringLen > 0 Then
          ReDim result(StringLen) As String
          Dim i As Long, CharCode As Integer
          Dim Char As String, Space As String
      
          If SpaceAsPlus Then Space = "+" Else Space = "%20"
      
          For i = 1 To StringLen
            Char = Mid$(StringVal, i, 1)
            CharCode = Asc(Char)
            Select Case CharCode
              Case 97 To 122, 65 To 90, 48 To 57, 45, 46, 95, 126
                result(i) = Char
              Case 32
                result(i) = Space
              Case 0 To 15
                result(i) = "%0" & Hex(CharCode)
              Case Else
                result(i) = "%" & Hex(CharCode)
            End Select
          Next i
          URLEncode = Join(result, "")
        End If
      End Function
      

      请注意,这两个函数都不支持 UTF-8 编码.

      Note that neither of these two functions support UTF-8 encoding.

      这篇关于如何在 Excel VBA 中对字符串进行 URL 编码?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆