在做爬虫、网抓项目时,必不可少的要寻找目标资源的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的其它部分也可以快速地解析。