如何用vba对Unicode编码解码?

在做爬虫、网抓项目时,必不可少的要寻找目标资源的URL。

 

有时候返回的URL是形如这样的

 

http:\/\/archive.cdn.fonts.net.cn\/font-38195-191216220816.zip?response-content-disposition=attachment%3Bfilename%3D%22FenPinYinTi.zip%22\u0026auth_key=1576547567-5df834d15f8337x03953276-0-86e044b4c94a2e46060223996a036d6e

 

里面的\u0026就是Unicode编码,然后\/\/也不是规范的URL分隔符。

 

如果直接把上述URL拷贝粘贴到网页浏览器中,是没有办法访问的。

 

 

为了获取可以访问的URL,需要将Unicode编码解码。

 

接下来介绍解码的方法

一、手动Unicode编码解码

谈起编码,花上2天2夜都聊不完。

 

简单的说,每一个字符,比如中文字符“我”,要让计算机能够识别,需要把它转换为一个二进制编码。

 

由于二进制编码很长,我们一般将二进制编码写成十六进制的形式。

 

在字符的编码历史发展中出现了很多种编码规则,一个中文字符“我”在不同的编码规则下,对应的编码是不一样的。

 

Unicode编码就是其中的一种编码规则,它规定了用什么编码来表示什么字符。

 

比如中文字符“我”的Unicode编码是6211(十六进制)。也就是规定了一个规则,告诉计算机凡是Unicode编码是6211的都识别为中文字符“我”。

 

那上文中的Unicode编码0026又表示什么字符呢。

 

这里介绍一个简单的方法

 

打开一个空白Word,输入0026,然后按下Alt+X组合快捷键,即可快速地知道该Unicode编码对应的字符。

 

二、用VBA对Unicode编码解码

知道了Unicode编码的含义,我们还可以在vba中直接用ChrW函数将Unicode编码解码出来,代码如下:

 

Sub excelofficeQQ1722187970()
    '十六进制Unicode编码
    sCode = 6211
    '转换为VBA里面的十六进制表示法
    str1 = "&H" & sCode
    '将Unicode编码解码成字符
    Debug.Print ChrW(str1)
End Sub

 

上面的代码实现的是单个Unicode编码的解码。

 

如果即有Unicode编码又有其它字符,可以使用如下的自定义函数解码:

Function UDecode(ByVal UCode As String)
    arr = Split(UCode, "\u")
    If UBound(arr) >= 0 Then
    For i = 1 To UBound(arr)
        arr(i) = ChrW("&H" & Left(arr(i), 4)) & Mid(arr(i), 5, 1024)
    Next i
        UDecode = Join(arr, "")
    Else
        UDecode = UCode
    End If
    Debug.Print UDecode
End Function

上述介绍的方法和思路是按照Unicode编码的原理进行解码。

 

对于Unicode编码这种常见的编码,还可以用直接调用JS整体解析,无需逐个字符解码,代码如下:

Function UDecode(ByVal UCode As String) As String
    Dim oHtml As Object
    Set oHtml = CreateObject("htmlfile")
    With oHtml
        Set oWindow = .parentWindow
        With oWindow
            .execScript "var sResult='" & UCode & "'"
            UDecode = .sResult
        End With
    End With
    Set oWindow = Nothing
    Set oHtml = Nothing
End Function

把要解码的内容放到JS里面跑一遍出来后就是解码后的内容,真是太神奇了。

三、总结

本文简单的介绍了什么是Unicode编码,然后给出了vba循环解码和调用JS解码的两种通用的自定义函数。

对于调用JS解码是我比较推荐的,方便快捷,而且对于URL的其它部分也可以快速地解析。

       

发表评论