VBA에서 텍스트를 URLEncode/URLDecode 하는 것은 아래  함수를 이용할 수 있습니다.

Function ENCODEURL(varText As Variant, Optional blnEncode = True)
    Static objHtmlfile As Object
    If objHtmlfile Is Nothing Then
    Set objHtmlfile = CreateObject("htmlfile")
    With objHtmlfile.parentWindow
    .execScript "function encode(s) {return encodeURIComponent(s)}", "jscript"
    End With
    End If
    If blnEncode Then
    ENCODEURL = objHtmlfile.parentWindow.encode(varText)
    End If
End Function

Function DECODEURL(varText As Variant, Optional blnEncode = True)
    Static objHtmlfile As Object
    If objHtmlfile Is Nothing Then
    Set objHtmlfile = CreateObject("htmlfile")
    With objHtmlfile.parentWindow
    .execScript "function decode(s) {return decodeURIComponent(s)}", "jscript"
    End With
    End If
    If blnEncode Then
    DECODEURL = objHtmlfile.parentWindow.decode(varText)
    End If
End Function

하지만 VBA에서 utf-8로 인코딩된 한글 텍스트에 대해서는 위 함수가 잘 작동하지만

Euc-kr 인 텍스트에 대해서는 제대로 결과를 출력하지 못합니다.

 

VBA가 한글텍스트를 UTF-8로 만들어버리기도 하고

억지로 Binary로 읽어서 위 함수를 적용해도 자동화 오류를 뿜어내버립니다.

 

그래서 URLEncoding하는 사용자 함수를 만들어 써야 합니다.

'Powered by http://www.program1472.com/bbs/board.php?bo_table=TB_03&wr_id=93&wmode=1

Private Function URLEncode1472(ByVal StringVal As String, ByVal EncType 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 CreateObject("ADODB.Stream")
            .Mode = 3 '// adModeReadWrite
            .Type = 2 '// adTypeText
            .CharSet = EncType  '//euc-kr, utf-8...
            .Open
            .WriteText StringVal
            .Position = 0
            .Type = 1 '// adTypeBinary
            If LCase(EncType) = "utf-8" Then .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
 
        URLEncode1472 = Join(result, "")
  End If
  
End Function
 
Private Sub test()

    Debug.Print URLEncode1472("크리스마스", "euc-kr")

    Debug.Print URLEncode1472("크리스마스", "utf-8")
    
    Debug.Print URLEncode1472("크리스마스 축하", "euc-kr", True)

    Debug.Print URLEncode1472("크리스마스 축하", "utf-8", True)
End Sub

 

예를 들어 '크리스마스'라는 텍스트의 euc-kr 인코딩값과 utf-8인코딩된 결과의 차이는 아래와 같습니다.

 

사실 URLEncoding이란 문자를 16진수 Hex값으로 바꾼 결과입니다.

한글 1글자당 euc-kr은 2바이트를 사용하고  utf-8은 3바이트를 사용합니다.

utf-8이 코드 범위가 더 커서 여러 나라 언어를 표현할 수 있는 장점이 있습니다.

반면 euc-kr은 여러나라 코드를 동시에 나타내지는 못하지만  메모리가 절약된다는 장점이 있습니다.

 

- EUC-KR인코딩된 문자의 URLEncode결과: %C5%A9%B8%AE%BD%BA%B8%B6%BD%BA
- UTF-8인코딩된 문자의 URLEncode결과: %ED%81%AC%EB%A6%AC%EC%8A%A4%EB%A7%88%EC%8A%A4

 

아래 실행 결과를 확인하면 Hex값과 URLEncode한 값이 서로 일치하는 것을 알 수 있습니다.

실행결과

 

🤍 인코딩/디코딩 확인 사이트: https://dencode.com/

💛 관련 지식인: 링크