VB、VBS、VBA 、ASP 的 UTF-8 base64 实现

32 篇文章 2 订阅
18 篇文章 0 订阅

    先前一直在用的Base64编码(https://blog.csdn.net/jessezappy/article/details/53561739?utm_source=blogxgwz5),一切正常,这几天有个项目需要用 UTF-8 编码 base64 ,随即试了一下,发现结果不同,检查才发现,原 base64 编码使用的是 unicode(GB2312) 数据进行编码的,于是找了个字符串 unicode(GB2312) 转 UTF-8 的函数改造了一下,重新打造了个 VB 的 base84(utf-8),经测试(https://tool.oschina.net/encrypt?type=3) 工作正确,代码如下:

Public Function UB64EnArr(pasStr, map) '编码MD5的文本型十六进制串数值内容,例:E4B8AD  -----20200524改合
    Dim max, idx, i, L, mAllByteIn()
    L = Len(pasStr) / 2 - 1
    ReDim mAllByteIn(L)
    For i = 0 To L
        mAllByteIn(i) = CByte("&H" & Mid(pasStr, i * 2 + 1, 2))
    Next
    UB64EnArr = UB64En(mAllByteIn, map)
End Function

Public Function UB64En(mAllByteIn, map) '编码去除 unicode 空 0 字符串byte字节数组 -----20200524改合
    Dim max, idx, Base64EncMap(64), BASE_64_MAP_INIT, i, L
    Dim ret, ndx, by3
    Dim first, second, third
    Dim inLangth
    'On Error Resume Next  '---------防止非法字串
    UB64En = ""
    L = UBound(mAllByteIn)
    If (L > 1) Then
        Select Case Len(map) '---20200509改
            Case 0  '标准Base64码表
                BASE_64_MAP_INIT = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
            Case 1  '自定义码表1
                BASE_64_MAP_INIT ="略,请自行设置" '---web不能用 = +号,改为用 [ _ 代替'
            Case 2  '标准UUE码表
                BASE_64_MAP_INIT = "`!" & """" & "#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_~"
            Case Else  '直接传入自定义码表
                BASE_64_MAP_INIT = map
        End Select
        max = Len(BASE_64_MAP_INIT)
        For idx = 0 To max - 1
            Base64EncMap(idx) = Asc(Mid(BASE_64_MAP_INIT, idx + 1, 1))
        Next
        inLangth = UBound(mAllByteIn) + 1
        by3 = (inLangth \ 3) * 3
        ndx = 1
        Do While ndx <= by3
            first = mAllByteIn(ndx - 1)
            second = mAllByteIn(ndx + 0)
            third = mAllByteIn(ndx + 1)
            ret = ret & Chr(Base64EncMap((first \ 4) And 63))
            ret = ret & Chr(Base64EncMap(((first * 16) And 48) + ((second \ 16) And 15)))
            ret = ret & Chr(Base64EncMap(((second * 4) And 60) + ((third \ 64) And 3)))
            ret = ret & Chr(Base64EncMap(third And 63))
            ndx = ndx + 3
        Loop
        If by3 < inLangth Then
            first = mAllByteIn(ndx - 1)
            ret = ret & Chr(Base64EncMap((first \ 4) And 63))
            If (inLangth Mod 3) = 2 Then
                second = mAllByteIn(ndx + 0)
                ret = ret & Chr(Base64EncMap(((first * 16) And 48) + ((second \ 16) And 15)))
                ret = ret & Chr(Base64EncMap(((second * 4) And 60))) & Chr(Base64EncMap(UBound(Base64EncMap)))
            Else
                ret = ret & Chr(Base64EncMap((first * 16) And 48))
                ret = ret & Chr(Base64EncMap(UBound(Base64EncMap))) & Chr(Base64EncMap(UBound(Base64EncMap)))
            End If
        End If
        UB64En = ret
    Else
        UB64En = ""
    End If
End Function

Public Function UB64EnStr(pasStr, map, codepage) '编码普通字符串 加入编码类型设置base64_utf8,默认为GB2312 -----20200524改合
    Dim L, mAllByteIn
    'On Error Resume Next  '---------防止非法字串
    UB64EnStr = ""
    L = Len(pasStr) - 1
    If (L > 1) Then
        If UCase(codepage) = "UTF-8" Then
            UB64EnStr = UB64EnArr(str2UTF8(pasStr), map)
        Else
            mAllByteIn = str2arr(pasStr)
            UB64EnStr = UB64En(mAllByteIn, map)
        End If
    Else
        UB64EnStr = ""
    End If
End Function

Public Function str2UTF8(szInput) '只返回十六进制文本串 -----20200524改合
    Dim wch, uch, szRet
    Dim x, i
    Dim nAsc, nAsc2, nAsc3, s2b()
    '如果输入参数为空,则退出函数
    If szInput = "" Then
        str2UTF8 = szInput
        Exit Function
    End If
    '开始转换
    For x = 1 To Len(szInput)
        '利用mid函数分拆GB编码文字
        wch = Mid(szInput, x, 1)
        '利用ascW函数返回每一个GB编码文字的Unicode字符代码
        '注:asc函数返回的是ANSI 字符代码,注意区别
        nAsc = AscW(wch)
        If nAsc < 0 Then
            nAsc = nAsc + 65536
        End If
 
        If (nAsc And &HFF80) = 0 Then
            szRet = szRet & Right("00" & Hex(Asc(wch)), 2)
        Else
            If (nAsc And &HF000) = 0 Then
                uch = Hex(((nAsc \ 64)) Or &HC0) & Hex(nAsc And &H3F Or &H80)
                szRet = szRet & uch
            Else
                'GB编码文字的Unicode字符代码在0800 - FFFF之间采用三字节模版 , 2 ^ 12=4096 , 2 ^ 6=64
                uch = Hex((nAsc \ 4096) Or &HE0) & _
                      Hex((nAsc \ 64) And &H3F Or &H80) & _
                      Hex(nAsc And &H3F Or &H80)
                szRet = szRet & uch
            End If
        End If
    Next
    '---------翻译为byte数组
'    ReDim s2b(Len(szRet) / 2 - 1)
'    For i = 1 To Len(szRet) Step 2
'        s2b((i - 1) / 2) = CByte("&H" & Mid(szRet, i, 2))
'    Next
    str2UTF8 = szRet
End Function

Public Function str2arr(varstr) '把普通字符串转成二进制数组函数
    Dim i, varlow, varhigh, varasc, varchar, k
    Dim s2b() 'As Byte
    'str2bin = ""
    For i = 0 To Len(varstr) - 1
        varchar = Mid(varstr, i + 1, 1)
        varasc = Asc(varchar)
        ' asc对中文字符求出来的值可能为负数,
        ' 加上65536就可求出它的无符号数值
        ' -1在机器内是用补码表示的0xffff,
        ' 其无符号值为65535,65535=-1+65536
        ' 其他负数依次类推。
        If varasc < 0 Then
            varasc = varasc + 65535
        End If
       '对中文的处理:把双字节低位和高位分开
        If varasc > 255 Then
            varlow = Left(Hex(Asc(varchar)), 2)
            varhigh = Right(Hex(Asc(varchar)), 2)
            'str2bin = str2bin & ChrB("&H" & varlow) & ChrB("&H" & varhigh)
            If i = 0 Then
                ReDim s2b(1)
                k = 0
                s2b(k) = CByte("&H" & varlow) '强制转换为字节,下同
                s2b(k + 1) = CByte("&H" & varhigh)
                k = 1
            Else
                ReDim Preserve s2b(k + 2)
                s2b(k + 1) = CByte("&H" & varlow)
                s2b(k + 2) = CByte("&H" & varhigh)
                k = k + 2
            End If
        Else
            'str2bin = str2bin & ChrB(AscB(varchar))
            If i = 0 Then
                ReDim s2b(0)
                k = 0
                s2b(k) = Asc(varchar)
            Else
                ReDim Preserve s2b(k + 1)
                s2b(k + 1) = Asc(varchar)
                k = k + 1
            End If
        End If
    Next
    str2arr = s2b
End Function

使用范例:

Sub testa()
    Dim a, d
    a = "123中文,?αabc"
    d = UB64EnStr(a, "", "utf-8") '  MTIz5Lit5paH77yM77yfzrFhYmM=
    d = UB64EnStr(a, "", " ")     '  MTIz1tDOxKOso7+mwWFiYw==
End Sub

其实和以前使用的变化仅仅是编码操作使用的字节数组进行了 UTF-8 编码转换而已。

以上代码以去除 AS 标识,可直接用于 VB6、VBS、ASP、VBA

此记!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: VB是Visual Basic的简称,是一种编程语言。UTF-8是一种常用的字符编码方式,它可以用来表示世界上几乎所有的字符。而Base64是一种将二进制数据转换成文本格式的编码方法。 在VB中,我们可以使用UTF-8编码来处理字符数据,包括将字符串转换为UTF-8编码格式,或者将UTF-8编码的数据解码为字符串。具体的操作可以使用VB提供的内置函数或者使用第三方库来实现。 而Base64编码方法可以将任意的二进制数据转换为由64个字符组成的文本字符串。在VB中,我们可以使用Base64编码将二进制数据转换为文本格式,或者将Base64编码的数据解码为原始的二进制数据。同样,我们可以使用VB的内置函数或者第三方库来实现Base64的相关操作。 总结起来,VB可以通过使用UTF-8编码Base64编码来处理字符和二进制数据的转换。这样可以在VB程序中实现对不同编码和数据格式的处理和转换。 ### 回答2: 在VB中,我们可以使用UTF-8编码来对字符串进行编码和解码,并且结合Base64编码方式进行处理。UTF-8是一种变长编码方式,可以表示各种国际字符,而Base64是一种将二进制数据转换为可打印字符的编码方式。下面是一个简单的示例来说明如何在VB中将字符串进行UTF-8编码,并使用Base64进行处理: 1. 首先,我们需要导入System.Text和System.Convert命名空间。这样我们可以使用UTF-8编码Base64转换的相关类: Imports System.Text Imports System.Convert 2. 假设我们要将一个字符串进行编码并使用Base64表示,可以使用以下代码: Dim originalString As String = "你好,世界!" Dim utf8Bytes As Byte() = Encoding.UTF8.GetBytes(originalString) Dim base64String As String = Convert.ToBase64String(utf8Bytes) 这里,原始字符串为"你好,世界!",我们使用UTF-8编码将其转换为字节数组utf8Bytes,然后使用Convert.ToBase64String方法将字节数组转换为Base64表示的字符串base64String。 3. 如果我们想对Base64表示的字符串进行解码并还原为原始字符串,可以使用以下代码: Dim decodedBytes As Byte() = Convert.FromBase64String(base64String) Dim decodedString As String = Encoding.UTF8.GetString(decodedBytes) 在这里,我们使用Convert.FromBase64String方法将Base64表示的字符串转换为字节数组decodedBytes,并使用Encoding.UTF8.GetString方法将字节数组转换为原始字符串decodedString。 通过以上步骤,我们可以在VB中使用UTF-8编码Base64对字符串进行处理。这对于在不同平台或系统上进行数据传输和处理非常有用,因为Base64表示的字符串是可打印的,并且UTF-8编码可以用来表示各种国际字符。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jessezappy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值