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