2017-01-10 235 views
0

我在Excel工作表中使用了我希望用Base64進行編碼的XML文本。我發現了一些實際上做得很好的代碼。唯一的問題是,我不能使用Excel中的VBA編碼特殊字符,如德語變音符號。 那麼有人知道如何做到這一點?我認爲這應該是可能的,因爲PHP base64函數也可以處理這些字符。在Excel中對Base64進行特殊字符編碼VBA

+2

你從哪裏找到代碼/代碼是什麼?請更新您的問題以包含此內容 – CallumDA

+1

通過'ADODB.Stream'將UTF-8或Unicode中的XML文本轉換爲二進制數據,然後通過'MSXml2.DOMDocument'將該二進制文件轉換爲Base64。 – omegastripes

回答

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("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中,字符集ASCIIB2和公式=TextBase64Encode($A$2;B2)C2中。現在ASCII表示編碼爲Base64串將出現在細胞C2

step1

輸入的公式=TextBase64Decode(C2;B2)D2爲Base64解碼回到:

step2

增加了更多的字符集,拉伸式向下並加入標題:

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。順便說一句,只需將bin.base64替換爲bin.hex即可使用六進制值代替Base64。