No Programming, No Life

プログラミング関連の話題や雑記

Excel VBAでUTF-8でパーセントエンコードされた文字列をデコードする(簡易版)

f:id:fumokmm:20191216193045p:plain

Excel VBAUTF-8でパーセントエンコードされた文字列をデコードする必要があり、ちょっと調べてみたらADODB.Streamを使うと出来そうだったのでやってみた。

環境

  • Windows 10 (バージョン 1903) 64bit
  • Excel Office365 MSO (16.0.12228.20322) 64bit

コード

Option Explicit

'''
' UTF-8でパーセントエンコードされた文字列をデコードします
'
' @param percentEncodedStr UTF-8でパーセントエンコードされた文字列
' @return デコードした文字列
'
' ※ADODB.Streamを利用するため、ツール > 参照設定で
' 「Microsoft ActiveX Data Objects 6.1 Library」を追加してください。
'
Public Function PercentDecode(percentEncodedStr As String) As String
  ' 空文字なら空文字を返却
  If IsEmpty(percentEncodedStr) Then
    PercentDecode = ""
    Exit Function
  End If

  ' ストリームをオープン
  Dim objStm As ADODB.Stream
  Set objStm = New ADODB.Stream
  objStm.Open
  
  ' ストリームをリセット
  objStm.Position = 0
  objStm.SetEOS
  
  ' バイナリを書き込み
  objStm.Type = ADODB.adTypeBinary
  objStm.Write ToHexBytes(percentEncodedStr)
  
  ' UTF-8でテキスト読み込み
  objStm.Position = 0
  objStm.Type = ADODB.adTypeText
  objStm.Charset = "UTF-8"
  PercentDecode = objStm.ReadText() ' 結果返却
  
  ' ストリームをクローズ
  objStm.Close
  Set objStm = Nothing
End Function

'''
' UTF-8でパーセントエンコードされた文字列をバイト配列に変換します
'
' @param percentEncodedStr UTF-8でパーセントエンコードされた文字列
' @return バイト配列
'
Private Function ToHexBytes(percentEncodedStr As String) As Byte()
  Dim size As Long
  size = Len(percentEncodedStr) / 3
  
  Dim bytes() As Byte
  ReDim bytes(0 To size - 1)
  Dim i As Long
  For i = 0 To size - 1
    bytes(i) = Val("&H" & Mid(percentEncodedStr, (i * 3) + 2, 2))
  Next i

  ToHexBytes = bytes
End Function

使い方

PercentDecodeがパブリック関数になっているので、こちらをExcelの数式などとして利用するだけ。引数はパーセントエンコードされた文字列を受け取り、戻り値はデコードした文字列となる。

デモ

f:id:fumokmm:20191216192520g:plain

注意

なお、すべての文字が3バイトにパーセントエンコードされていた場合しか想定していません。また、例外処理なども省略しています。あくまでテスト用ということで利用する際はもうちょっとアレンジが必要。

参考

EXCEL VBAメモ - UTF-8バイト列を文字に変換する - hakeの日記

NonSoft - ADODB.Streamによる文字コード変換のサンプル(VB6)

URLデコードを行う:エクセルマクロ・Excel VBAの使い方/ユーザー定義関数