首页 文章

在Excel VBA中将特殊字符编码到Base64

提问于
浏览
1

我在Excel工作表中有XML文本,我想用Base64编码 . 我找到了一些实际上做得很好的代码 . 唯一的问题是我不能用Excel中的VBA编码特殊字符,如德语变音符号 . 那么有人知道怎么做吗?我认为它应该是可能的,因为PHP base64函数也可以处理这样的字符 .

1 回答

  • 2

    Base64编码的字符串表示在某些字符集中包含特殊字符的初始字符串,适用于此类特殊字符 . 首先,您应该选择使用哪个charset . 通常UTF-8或UTF-16都可以 . 我猜你遇到的问题是由ASCII引起的 .

    在下面的示例中, TextBase64Encode 函数允许将文本编码为Base64,并将 TextBase64Decode 解码为文本:

    Function TextBase64Encode(strText, strCharset)
    
        Dim arrBytes
    
        With CreateObject("ADODB.Stream")
            .Type = 2 ' adTypeText
            .Open
            .Charset = strCharset
            .WriteText strText
            .Position = 0
            .Type = 1 ' adTypeBinary
            arrBytes = .Read
            .Close
        End With
    
        With CreateObject("Microsoft.XMLDOM").createElement("tmp")
            .DataType = "bin.base64"
            .nodeTypedValue = arrBytes
            TextBase64Encode = Replace(Replace(.Text, vbCr, ""), vbLf, "")
        End With
    
    End Function
    
    Function TextBase64Decode(strBase64, strCharset)
    
        Dim arrBinary
    
        With CreateObject("MSXML2.DOMDocument").createElement("tmp")
            .DataType = "bin.base64"
            .Text = strBase64
            arrBinary = .nodeTypedValue
        End With
    
        With CreateObject("ADODB.Stream")
            .Type = 1 ' adTypeBinary
            .Open
            .Write arrBinary
            .Position = 0
            .Type = 2 ' adTypeText
            .Charset = strCharset
            TextBase64Decode = .ReadText
            .Close
        End With
    
    End Function
    

    为了更清楚,我输入了一个样本,其中包含特殊字符,如单元格 A2 中的德语变音符号, B2 中的字符集 ASCIIC2 中的公式 =TextBase64Encode($A$2;B2) . 现在ASCII表示编码为Base64的字符串将出现在单元格 C2 中:

    step1

    D2 中输入公式 =TextBase64Decode(C2;B2) 以解码Base64:

    step2

    添加了更多字符集,拉伸公式并添加 Headers :

    step3

    现在您可以看到,UTF-8,UTF-16,UTF-7,Windows-1250,latin1保留了初始样本变音符号,但是ASCII破坏了 . 有关系统已知的字符集名称的列表,请参阅Windows注册表中 HKEY_CLASSES_ROOT\MIME\Database\Charset 的子项 . 注意,UTF-16 LE编码的字符串通常包括开头的字节0xFF,0xFE,它们是Unicode字节顺序标记(BOM),BOM的UTF-8表示是开始时的字节0xEF,0xBB,0xBF . BTW只需将 bin.base64 替换为 bin.hex 即可使用十六进制值而不是Base64 .

相关问题