Access2Base - UTF-8 encoding and %-encoding
Application to SendMailWithoutAttachment => "mailto: ... " uri Change-Id: I53aa0325c048dca678ff134908d448afab08933d
This commit is contained in:
@@ -2420,29 +2420,23 @@ Private Function _SendWithoutAttachment(ByVal pvTo As Variant _
|
|||||||
, ByVal psBody As String _
|
, ByVal psBody As String _
|
||||||
) As Boolean
|
) As Boolean
|
||||||
'Send simple message with mailto: syntax
|
'Send simple message with mailto: syntax
|
||||||
Dim sMailTo As String, sTo As String, sCc As String, sBcc As String, sSubject As String, sBody As String, oDispatch As Object
|
Dim sMailTo As String, sTo As String, sCc As String, sBcc As String, oDispatch As Object
|
||||||
Const cstComma = ","
|
Const cstComma = ","
|
||||||
Const cstSpace = "%20"
|
|
||||||
Const cstLF = "%0A"
|
|
||||||
|
|
||||||
If _ErrorHandler() Then On Local Error Goto Error_Function
|
If _ErrorHandler() Then On Local Error Goto Error_Function
|
||||||
|
|
||||||
If UBound(pvTo) >= 0 Then sTo = Trim(Join(pvTo, cstComma)) Else sTo = ""
|
If UBound(pvTo) >= 0 Then sTo = Trim(Join(pvTo, cstComma)) Else sTo = ""
|
||||||
If UBound(pvCc) >= 0 Then sCc = Trim(Join(pvCc, cstComma)) Else sCc = ""
|
If UBound(pvCc) >= 0 Then sCc = Trim(Join(pvCc, cstComma)) Else sCc = ""
|
||||||
If UBound(pvBcc) >= 0 Then sBcc = Trim(Join(pvBcc, cstComma)) Else sBcc = ""
|
If UBound(pvBcc) >= 0 Then sBcc = Trim(Join(pvBcc, cstComma)) Else sBcc = ""
|
||||||
If psSubject <> "" Then sSubject = Join(Split(psSubject, " "), cstSpace) Else sSubject = ""
|
|
||||||
If psBody <> "" Then
|
|
||||||
sBody = Join(Split(Join(Split(psBody, Chr(13)), ""), Chr(10), cstLF)
|
|
||||||
sBody = Join(Split(sBody, " "), cstSpace)
|
|
||||||
End If
|
|
||||||
|
|
||||||
sMailTo = "mailto:" _
|
sMailTo = "mailto:" _
|
||||||
& sTo & "?" _
|
& sTo & "?" _
|
||||||
& Iif(sCc = "", "", "cc=" & sCc & "&") _
|
& Iif(sCc = "", "", "cc=" & sCc & "&") _
|
||||||
& Iif(sBcc = "", "", "bcc=" & sBcc & "&") _
|
& Iif(sBcc = "", "", "bcc=" & sBcc & "&") _
|
||||||
& Iif(sSubject = "", "", "subject=" & sSubject & "&") _
|
& Iif(psSubject = "", "", "subject=" & psSubject & "&") _
|
||||||
& Iif(sBody = "", "", "body=" & sBody & "&")
|
& Iif(psBody = "", "", "body=" & psBody & "&")
|
||||||
If Right(sMailTo, 1) = "&" Or Right(sMailTo, 1) = "?" Then sMailTo = Left(sMailTo, Len(sMailTo) - 1)
|
If Right(sMailTo, 1) = "&" Or Right(sMailTo, 1) = "?" Then sMailTo = Left(sMailTo, Len(sMailTo) - 1)
|
||||||
|
sMailTo = Utils._URLEncode(sMailTo)
|
||||||
|
|
||||||
oDispatch = createUnoService( "com.sun.star.frame.DispatchHelper")
|
oDispatch = createUnoService( "com.sun.star.frame.DispatchHelper")
|
||||||
oDispatch.executeDispatch(StarDesktop, sMailTo, "", 0, Array())
|
oDispatch.executeDispatch(StarDesktop, sMailTo, "", 0, Array())
|
||||||
|
@@ -585,6 +585,42 @@ Dim vSubStrings() As Variant, i As Integer, iLen As Integer
|
|||||||
|
|
||||||
End Function ' PCase V0.9.0
|
End Function ' PCase V0.9.0
|
||||||
|
|
||||||
|
REM -----------------------------------------------------------------------------------------------------------------------
|
||||||
|
Private Function _PercentEncode(ByVal psChar As String) As String
|
||||||
|
' Percent encoding of single psChar character
|
||||||
|
' https://en.wikipedia.org/wiki/UTF-8
|
||||||
|
|
||||||
|
Dim lChar As Long, sByte1 As String, sByte2 As String, sByte3 As String
|
||||||
|
lChar = Asc(psChar)
|
||||||
|
|
||||||
|
Select Case lChar
|
||||||
|
Case 48 To 57, 65 To 90, 97 To 122 ' 0-9, A-Z, a-z
|
||||||
|
_PercentEncode = psChar
|
||||||
|
Case "-", ".", "_", "~"
|
||||||
|
_PercentEncode = psChar
|
||||||
|
Case "!", "$", "&", "'", "(", ")", "*", "+", ",", ";", "=" ' Reserved characters used as delimitors in query strings
|
||||||
|
_PercentEncode = psChar
|
||||||
|
Case " ", "%"
|
||||||
|
_PercentEncode = "%" & Right("00" & Hex(lChar), 2)
|
||||||
|
Case 0 To 127
|
||||||
|
_PercentEncode = psChar
|
||||||
|
Case 128 To 2047
|
||||||
|
sByte1 = "%" & Right("00" & Hex(Int(lChar / 64) + 192), 2)
|
||||||
|
sByte2 = "%" & Right("00" & Hex((lChar Mod 64) + 128), 2)
|
||||||
|
_PercentEncode = sByte1 & sByte2
|
||||||
|
Case 2048 To 65535
|
||||||
|
sByte1 = "%" & Right("00" & Hex(Int(lChar / 4096) + 224), 2)
|
||||||
|
sByte2 = "%" & Right("00" & Hex(Int(lChar - (4096 * Int(lChar / 4096))) /64 + 128), 2)
|
||||||
|
sByte3 = "%" & Right("00" & Hex((lChar Mod 64) + 128), 2)
|
||||||
|
_PercentEncode = sByte1 & sByte2 & sByte3
|
||||||
|
Case Else ' Not supported
|
||||||
|
_PercentEncode = psChar
|
||||||
|
End Select
|
||||||
|
|
||||||
|
Exit Function
|
||||||
|
|
||||||
|
End Function ' _PercentEncode V1.4.0
|
||||||
|
|
||||||
REM -----------------------------------------------------------------------------------------------------------------------
|
REM -----------------------------------------------------------------------------------------------------------------------
|
||||||
Public Sub _ResetCalledSub(ByVal psSub As String)
|
Public Sub _ResetCalledSub(ByVal psSub As String)
|
||||||
' Called in bottom of each public function. _A2B_.CalledSub variable is used for error handling
|
' Called in bottom of each public function. _A2B_.CalledSub variable is used for error handling
|
||||||
@@ -690,4 +726,72 @@ Dim sTrim As String, vTrim() As Variant, i As Integer, j As Integer, iCount As I
|
|||||||
_TrimArray() = vTrim()
|
_TrimArray() = vTrim()
|
||||||
|
|
||||||
End Function ' TrimArray V0.9.0
|
End Function ' TrimArray V0.9.0
|
||||||
|
|
||||||
|
REM -----------------------------------------------------------------------------------------------------------------------
|
||||||
|
Private Function _URLEncode(ByVal psToEncode As String) As String
|
||||||
|
' http://www.w3schools.com/tags/ref_urlencode.asp
|
||||||
|
' http://xkr.us/articles/javascript/encode-compare/
|
||||||
|
' http://tools.ietf.org/html/rfc3986
|
||||||
|
|
||||||
|
Dim sEncoded As String, sChar As String
|
||||||
|
Dim lCurrentChar As Long, bQuestionMark As Boolean
|
||||||
|
|
||||||
|
sEncoded = ""
|
||||||
|
bQuestionMark = False
|
||||||
|
For lCurrentChar = 1 To Len(psToEncode)
|
||||||
|
sChar = Mid(psToEncode, lCurrentChar, 1)
|
||||||
|
Select Case sChar
|
||||||
|
Case " ", "%"
|
||||||
|
sEncoded = sEncoded & _PercentEncode(sChar)
|
||||||
|
Case "?" ' Is it the first "?" ?
|
||||||
|
If bQuestionMark Then ' "?" introduces in a URL the arguments part
|
||||||
|
sEncoded = sEncoded & _PercentEncode(sChar)
|
||||||
|
Else
|
||||||
|
sEncoded = sEncoded & sChar
|
||||||
|
bQuestionMark = True
|
||||||
|
End If
|
||||||
|
Case "\"
|
||||||
|
If bQuestionMark Then
|
||||||
|
sEncoded = sEncoded & _PercentEncode(sChar)
|
||||||
|
Else
|
||||||
|
sEncoded = sEncoded & "/" ' If Windows file naming ...
|
||||||
|
End If
|
||||||
|
Case Else
|
||||||
|
If bQuestionMark Then
|
||||||
|
sEncoded = sEncoded & _PercentEncode(sChar)
|
||||||
|
Else
|
||||||
|
sEncoded = sEncoded & _UTF8Encode(sChar) ' Because IE does not support %encoding in first part of URL
|
||||||
|
End If
|
||||||
|
End Select
|
||||||
|
Next lCurrentChar
|
||||||
|
|
||||||
|
_URLEncode = sEncoded
|
||||||
|
|
||||||
|
End Function ' _URLEncode V1.4.0
|
||||||
|
|
||||||
|
REM -----------------------------------------------------------------------------------------------------------------------
|
||||||
|
Private Function _UTF8Encode(ByVal psChar As String) As String
|
||||||
|
' &-encoding of single psChar character (e.g. "é" becomes "&eacute;" or numeric equivalent
|
||||||
|
' http://www.w3schools.com/charsets/ref_html_utf8.asp
|
||||||
|
|
||||||
|
Select Case psChar
|
||||||
|
Case """" : _UTF8Encode = "&quot;"
|
||||||
|
Case "&" : _UTF8Encode = "&amp;"
|
||||||
|
Case "<" : _UTF8Encode = "&lt;"
|
||||||
|
Case ">" : _UTF8Encode = "&gt;"
|
||||||
|
Case "'" : _UTF8Encode = "&apos;"
|
||||||
|
Case ":", "/", "?", "#", "[", "]", "@" ' Reserved characters
|
||||||
|
_UTF8Encode = psChar
|
||||||
|
Case Chr(13) : _UTF8Encode = "" ' Carriage return
|
||||||
|
Case Chr(10) : _UTF8Encode = "<br>" ' Line Feed
|
||||||
|
Case < Chr(126) : _UTF8Encode = psChar
|
||||||
|
Case "€" : _UTF8Encode = "&euro;"
|
||||||
|
Case Else : _UTF8Encode = "&#" & Asc(psChar) & ";"
|
||||||
|
End Select
|
||||||
|
|
||||||
|
Exit Function
|
||||||
|
|
||||||
|
End Function ' _UTF8Encode V1.4.0
|
||||||
|
|
||||||
|
|
||||||
</script:module>
|
</script:module>
|
Reference in New Issue
Block a user