【问题标题】:Encoding special chracters to Base64 in Excel VBA在 Excel VBA 中将特殊字符编码为 Base64
【发布时间】:2022-04-09 12:33:21
【问题描述】:

我在 Excel 工作表中有想要使用 Base64 编码的 XML 文本。我发现了一些实际上做得很好的代码。唯一的问题是我无法在 Excel 中使用 VBA 对特殊字符(如德语变音符号)进行编码。 那么有人知道该怎么做吗?我认为应该可以,因为 PHP base64 函数也可以处理此类字符。

【问题讨论】:

  • 您在哪里找到代码/代码是什么?请更新您的问题以包含此
  • 通过ADODB.Stream将UTF-8或Unicode格式的XML文本转换为二进制数据,然后通过MSXml2.DOMDocument将该二进制转换为Base64。

标签: excel utf-8 base64 vba


【解决方案1】:

Base64 编码字符串表示在某些字符集中包含特殊字符的初始字符串,适合此类特殊字符。所以首先你应该选择使用哪个字符集。通常 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("MSXML2.DOMDocument").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

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

添加了更多字符集、向下拉伸公式并添加了标题:

现在您可以看到,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。顺便说一句,只需将 bin.base64 替换为 bin.hex 即可使用十六进制值而不是 Base64。

【讨论】:

    猜你喜欢
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-05
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多