How can I URL encode a string in Excel VBA?

后端 未结 15 2216
闹比i
闹比i 2020-11-22 11:39

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

15条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-11-22 12:15

    I had problem with encoding cyrillic letters to URF-8.

    I modified one of the above scripts to match cyrillic char map. Implmented is the cyrrilic section of

    https://en.wikipedia.org/wiki/UTF-8 and http://www.utf8-chartable.de/unicode-utf8-table.pl?start=1024

    Other sections development is sample and need verification with real data and calculate the char map offsets

    Here is the script:

    Public Function UTF8Encode( _
       StringToEncode As String, _
       Optional UsePlusRatherThanHexForSpace As Boolean = False _
    ) As String
    
      Dim TempAns As String
      Dim TempChr As Long
      Dim CurChr As Long
      Dim Offset As Long
      Dim TempHex As String
      Dim CharToEncode As Long
      Dim TempAnsShort As String
    
      CurChr = 1
    
      Do Until CurChr - 1 = Len(StringToEncode)
        CharToEncode = Asc(Mid(StringToEncode, CurChr, 1))
    ' http://www.utf8-chartable.de/unicode-utf8-table.pl?start=1024
    ' as per https://en.wikipedia.org/wiki/UTF-8 specification the engoding is as follows
    
        Select Case CharToEncode
    '   7   U+0000 U+007F 1 0xxxxxxx
          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 0 To &H7F
                TempAns = TempAns + "%" + Hex(CharToEncode And &H7F)
          Case &H80 To &H7FF
    '   11  U+0080 U+07FF 2 110xxxxx 10xxxxxx
    ' The magic is in offset calculation... there are different offsets between UTF-8 and Windows character maps
    ' offset 192 = &HC0 = 1100 0000 b  added to start of UTF-8 cyrillic char map at &H410
              CharToEncode = CharToEncode - 192 + &H410
              TempAnsShort = "%" & Right("0" & Hex((CharToEncode And &H3F) Or &H80), 2)
              TempAnsShort = "%" & Right("0" & Hex(((CharToEncode \ &H40) And &H1F) Or &HC0), 2) & TempAnsShort
              TempAns = TempAns + TempAnsShort
    
    '' debug and development version
    ''          CharToEncode = CharToEncode - 192 + &H410
    ''          TempChr = (CharToEncode And &H3F) Or &H80
    ''          TempHex = Hex(TempChr)
    ''          TempAnsShort = "%" & Right("0" & TempHex, 2)
    ''          TempChr = ((CharToEncode And &H7C0) / &H40) Or &HC0
    ''          TempChr = ((CharToEncode \ &H40) And &H1F) Or &HC0
    ''          TempHex = Hex(TempChr)
    ''          TempAnsShort = "%" & Right("0" & TempHex, 2) & TempAnsShort
    ''          TempAns = TempAns + TempAnsShort
    
          Case &H800 To &HFFFF
    '   16 U+0800 U+FFFF 3 1110xxxx 10xxxxxx 10xxxxxx
    ' not tested . Doesnot match Case condition... very strange
            MsgBox ("Char to encode  matched U+0800 U+FFFF: " & CharToEncode & " = &H" & Hex(CharToEncode))
    ''          CharToEncode = CharToEncode - 192 + &H410
              TempAnsShort = "%" & Right("0" & Hex((CharToEncode And &H3F) Or &H80), 2)
              TempAnsShort = "%" & Right("0" & Hex(((CharToEncode \ &H40) And &H3F) Or &H80), 2) & TempAnsShort
              TempAnsShort = "%" & Right("0" & Hex(((CharToEncode \ &H1000) And &HF) Or &HE0), 2) & TempAnsShort
              TempAns = TempAns + TempAnsShort
    
          Case &H10000 To &H1FFFFF
    '   21 U+10000 U+1FFFFF 4 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
    ''        MsgBox ("Char to encode  matched &H10000 &H1FFFFF: " & CharToEncode & " = &H" & Hex(CharToEncode))
    ' sample offset. tobe verified
              CharToEncode = CharToEncode - 192 + &H410
              TempAnsShort = "%" & Right("0" & Hex((CharToEncode And &H3F) Or &H80), 2)
              TempAnsShort = "%" & Right("0" & Hex(((CharToEncode \ &H40) And &H3F) Or &H80), 2) & TempAnsShort
              TempAnsShort = "%" & Right("0" & Hex(((CharToEncode \ &H1000) And &H3F) Or &H80), 2) & TempAnsShort
              TempAnsShort = "%" & Right("0" & Hex(((CharToEncode \ &H40000) And &H7) Or &HF0), 2) & TempAnsShort
              TempAns = TempAns + TempAnsShort
    
          Case &H200000 To &H3FFFFFF
    '   26  U+200000 U+3FFFFFF 5 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
    ''        MsgBox ("Char to encode  matched U+200000 U+3FFFFFF: " & CharToEncode & " = &H" & Hex(CharToEncode))
    ' sample offset. tobe verified
              CharToEncode = CharToEncode - 192 + &H410
              TempAnsShort = "%" & Right("0" & Hex((CharToEncode And &H3F) Or &H80), 2)
              TempAnsShort = "%" & Right("0" & Hex(((CharToEncode \ &H40) And &H3F) Or &H80), 2) & TempAnsShort
              TempAnsShort = "%" & Right("0" & Hex(((CharToEncode \ &H1000) And &H3F) Or &H80), 2) & TempAnsShort
              TempAnsShort = "%" & Right("0" & Hex(((CharToEncode \ &H40000) And &H3F) Or &H80), 2) & TempAnsShort
              TempAnsShort = "%" & Right("0" & Hex(((CharToEncode \ &H1000000) And &H3) Or &HF8), 2) & TempAnsShort
              TempAns = TempAns + TempAnsShort
    
          Case &H4000000 To &H7FFFFFFF
    '   31  U+4000000 U+7FFFFFFF 6 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
    ''        MsgBox ("Char to encode  matched U+4000000 U+7FFFFFFF: " & CharToEncode & " = &H" & Hex(CharToEncode))
    ' sample offset. tobe verified
              CharToEncode = CharToEncode - 192 + &H410
              TempAnsShort = "%" & Right("0" & Hex((CharToEncode And &H3F) Or &H80), 2)
              TempAnsShort = "%" & Right("0" & Hex(((CharToEncode \ &H40) And &H3F) Or &H80), 2) & TempAnsShort
              TempAnsShort = "%" & Right("0" & Hex(((CharToEncode \ &H1000) And &H3F) Or &H80), 2) & TempAnsShort
              TempAnsShort = "%" & Right("0" & Hex(((CharToEncode \ &H40000) And &H3F) Or &H80), 2) & TempAnsShort
              TempAnsShort = "%" & Right("0" & Hex(((CharToEncode \ &H1000000) And &H3F) Or &H80), 2) & TempAnsShort
              TempAnsShort = "%" & Right("0" & Hex(((CharToEncode \ &H40000000) And &H1) Or &HFC), 2) & TempAnsShort
              TempAns = TempAns + TempAnsShort
    
          Case Else
    ' somethig else
    ' to be developped
            MsgBox ("Char to encode not matched: " & CharToEncode & " = &H" & Hex(CharToEncode))
    
        End Select
    
        CurChr = CurChr + 1
      Loop
    
      UTF8Encode = TempAns
    End Function
    

    Good luck!

提交回复
热议问题