ExcelでUTF-8変換関数

文字列のUTF-8変換関数

Option Explicit

 

Function EncodeUTF8(ByVal DataText As String) As String '文字列をUTF-8でエンコードするユーザー定義関数

 

Dim Data As Variant
Dim D() As String
Dim D2() As String
Dim i As Integer
Dim j As Integer

 

ReDim Data(Len(DataText))
ReDim D(Len(DataText) * 4)
ReDim D2(Len(DataText) * 3)

 

If DataText = "" Then
        EncodeUTF8 = CVErr(xlErrValue)
        Exit Function
End If

For i = 1 To Len(DataText)
    Data(i) = Hex(AscW(Mid$(DataText, i, 1)))
    For j = 1 To 4
        D(i * 4 - 4 + j) = Mid$(Data(i), j, 1)
    Next j
Next i

For i = 1 To Len(DataText)
    If Len(Data(i)) = 4 Then
            D2(i * 3 - 3 + 1) = "%" & Hex(Hex("&H" & D(i * 3 - 3 + 1) + &HE0))
            D2(i * 3 - 3 + 2) = "%" & Hex(Hex(("&H" & D(i * 3 - 3 + 2) * 4 + &H80) + ("&H" & D(i * 3 - 3 + 3) And &HC) / 4))
            D2(i * 3 - 3 + 3) = "%" & Hex(("&H" & (D(i * 3 - 3 + 3) & D(i * 3 - 3 + 4)) And &H3F) + &H80)
           
            EncodeUTF8 = EncodeUTF8 & D2(i * 3 - 3 + 1) & D2(i * 3 - 3 + 2) & D2(i * 3 - 3 + 3)
        Else
            EncodeUTF8 = EncodeUTF8 & "%" & Data(i)
    End If
Next i

 

End Function

 

Function DecodeUTF8(ByRef DataText As String) As String '文字列をUTF-8からデコードするユーザー定義関数

 

Dim Data As Variant
Dim i As Integer
Dim D() As String

 

Data = Split(DataText, "%")

 

ReDim D(UBound(Data))

 

For i = 1 To UBound(Data) Step 3
    D(i) = Hex(("&H" & Data(i) And &HF) * 16 + ("&H" & Data(i + 1) And &H3C) / 4)
    D(i + 1) = Hex(("&H" & Data(i + 1) And &H3) * 64 + ("&H" & Data(i + 2) And &H3F))
    D(i + 2) = D(i) & D(i + 1)
   
    DecodeUTF8 = DecodeUTF8 & ChrW("&H" & D(i + 2))
Next i

 

End Function

以上。

 

思い付きで作ったので、あまり最適化していないけど誰かの参考になれば幸いです。

 

 Excel2013にはENCODEURL関数があるみたいです。

英数とピリオドは変換しないみたいです。