在 Excel VBA 中将特殊字符编码为 Base64
Encoding special chracters to Base64 in Excel VBA
我在 Excel sheet 中有 XML 文本,我想使用 Base64 对其进行编码。我发现了一些实际上做得很好的代码。唯一的问题是我无法在 Excel 中使用 VBA 编码特殊字符,例如德语变音符号。
那么有人知道该怎么做吗?我认为这应该是可能的,因为 PHP base64 函数也可以处理这些字符。
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("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
中的字符集 ASCII
和公式 =TextBase64Encode($A;B2)
在 C2
。 ASCII 表示编码为 Base64 的字符串出现在单元格 C2
:
在 D2
中输入公式 =TextBase64Decode(C2;B2)
以解码 Base64:
添加了更多字符集,向下扩展了公式并添加了 header:
现在您可以看到,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。
我在 Excel sheet 中有 XML 文本,我想使用 Base64 对其进行编码。我发现了一些实际上做得很好的代码。唯一的问题是我无法在 Excel 中使用 VBA 编码特殊字符,例如德语变音符号。 那么有人知道该怎么做吗?我认为这应该是可能的,因为 PHP base64 函数也可以处理这些字符。
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("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
中的字符集 ASCII
和公式 =TextBase64Encode($A;B2)
在 C2
。 ASCII 表示编码为 Base64 的字符串出现在单元格 C2
:
在 D2
中输入公式 =TextBase64Decode(C2;B2)
以解码 Base64:
添加了更多字符集,向下扩展了公式并添加了 header:
现在您可以看到,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。