VERSION 1.0 CLASS BEGIN MultiUse = -1 'True Persistable = 0 'NotPersistable DataBindingBehavior = 0 'vbNone DataSourceBehavior = 0 'vbNone MTSTransactionMode = 0 'NotAnMTSObject END Attribute VB_Name = "cStrings" Attribute VB_GlobalNameSpace = False Attribute VB_Creatable = True Attribute VB_PredeclaredId = False Attribute VB_Exposed = False Option Explicit ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Objeto responsável por tratar strings e realizar conversões ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Guarda o nome do objeto Private Const ST_MY_NAME As String = "cStrings" ' Caracteres de uma quebra de linha Private Const BT_NEW_LINE_CHAR1 As Byte = 13 Private Const BT_NEW_LINE_CHAR2 As Byte = 10 ' Posição final de conversão HTML Private Const IT_HTML_CONV_SIZE As Integer = 8 ' Posição final da conversão de TAG HTML Private Const IT_HTML_TAG_CONV_SIZE As Integer = 107 ' Início & final de conversão TAG Private Const ST_INIT_HTML_TAG As String = "&" Private Const ST_END_HTML_TAG As String = ";" Private Const LN_MAX_HTML_TAG_SIZE As Long = 6 ' Inicio de caracter especial Private Const CH_SPECIAL_CHAR As String = "%" Private Const CH_SPACE_CHAR As String = "+" ' Tamanho do chars de indicação de unicode Private Const LN_TXT_UNICODE As Long = 2 ' Unicode em TXT Private Const ST_TXT_UNICODE As String = "ÿþ" ' Unicode em TXT (quando sistema não suporta unicode muito bem) Private Const ST_TXT_UNICODE2 As String = "??" ' Tipo conversão de texto Private Type CHAR_CONV stSearch As String stReplace As String End Type ' Guarda conversões HTML Private vthcConv() As CHAR_CONV Private blVtConvLoaded As Boolean ' Guarda conversões TAG HTML Private vthcTagConv() As CHAR_CONV Private itTagConvPos As Integer Private blVtTagConvLoaded As Boolean ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Inicia a classe ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Private Sub Class_Initialize() ' End Sub ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Converte HTML para Texto ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Public Sub htmlTOtext(stInput As String) ' Converte códigos HTML convHTML stInput ' Converte tags HTML convTagHTML stInput End Sub ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Converte HTML para texto ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Private Sub convHTML(stInput As String) Dim itI As Integer ' Verifica se o vetor ainda não foi preenchido If Not blVtConvLoaded Then ' Redimenciona ReDim vthcConv(IT_HTML_CONV_SIZE) ' Preenche dados vthcConv(0).stSearch = Chr(13) vthcConv(1).stSearch = Chr(10) vthcConv(2).stSearch = "
"
vthcConv(3).stSearch = "
"
vthcConv(4).stSearch = "
"
vthcConv(5).stSearch = "
"
vthcConv(6).stSearch = ST_SEP + ST_SEP
vthcConv(7).stSearch = ST_SEP + ST_LINESEP
vthcConv(8).stSearch = ST_LINESEP + ST_SEP
vthcConv(0).stReplace = ST_INVALID_VALUE
vthcConv(1).stReplace = ST_INVALID_VALUE
vthcConv(2).stReplace = ST_LINESEP + ST_LINESEP
vthcConv(3).stReplace = ST_LINESEP
vthcConv(4).stReplace = ST_LINESEP
vthcConv(5).stReplace = ST_LINESEP
vthcConv(6).stReplace = ST_SEP
vthcConv(7).stReplace = ST_LINESEP
vthcConv(8).stReplace = ST_LINESEP
' Seta que foi carregado
blVtConvLoaded = True
End If
' Varre vetor de conversões
For itI = 0 To IT_HTML_CONV_SIZE
' Verifica se encontra
While InStr(1, stInput, vthcConv(itI).stSearch)
' Converte
stInput = Replace(stInput, vthcConv(itI).stSearch, vthcConv(itI).stReplace)
Wend
Next itI
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Converte TAG HTML para texto
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub addTagHTML(stSearch As String, stReplace As String)
' Seta valores
vthcTagConv(itTagConvPos).stReplace = stReplace
vthcTagConv(itTagConvPos).stSearch = stSearch
' Incrementa contador
itTagConvPos = itTagConvPos + 1
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Converte TAG HTML para texto
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub convTagHTML(stInput As String)
Dim itI As Integer
Dim lnAux(1) As Long
Dim stAux As String
On Error Resume Next
' Verifica se o vetor ainda não foi preenchido
If Not blVtTagConvLoaded Then
' Redimenciona vetor
ReDim vthcTagConv(IT_HTML_TAG_CONV_SIZE + 1)
' Preenche dados
addTagHTML "amp", "&"
addTagHTML "gt", ">"
addTagHTML "lt", "<"
addTagHTML "quot", Chr(34)
addTagHTML "acute", ","
addTagHTML "cedil", ","
addTagHTML "circ", "^"
addTagHTML "macr", "¯"
addTagHTML "middot", "."
addTagHTML "tilde", "~"
addTagHTML "uml", "¨"
addTagHTML "Aacute", "Á"
addTagHTML "aacute", "á"
addTagHTML "Acirc", "Â"
addTagHTML "acirc", "â"
addTagHTML "AElig", "Æ"
addTagHTML "aelig", "æ"
addTagHTML "Agrave", "À"
addTagHTML "agrave", "à"
addTagHTML "Aring", "Å"
addTagHTML "aring", "å"
addTagHTML "Atilde", "Ã"
addTagHTML "atilde", "ã"
addTagHTML "Auml", "Ä"
addTagHTML "auml", "ä"
addTagHTML "Ccedil", "Ç"
addTagHTML "ccedil", "ç"
addTagHTML "Eacute", "É"
addTagHTML "eacute", "é"
addTagHTML "Ecirc", "Ê"
addTagHTML "ecirc", "ê"
addTagHTML "Egrave", "È"
addTagHTML "egrave", "è"
addTagHTML "ETH", "Ð"
addTagHTML "eth", "ð"
addTagHTML "Euml", "Ë"
addTagHTML "euml", "ë"
addTagHTML "Iacut", "Í"
addTagHTML "iacute", "í"
addTagHTML "Icirc", "Î"
addTagHTML "icirc", "î"
addTagHTML "Igrave", "Ì"
addTagHTML "igrave", "ì"
addTagHTML "Iuml", "Ï"
addTagHTML "iuml", "ï"
addTagHTML "Ntilde", "Ñ"
addTagHTML "ntilde", "ñ"
addTagHTML "Oacute", "Ó"
addTagHTML "oacute", "ó"
addTagHTML "Ocirc", "Ô"
addTagHTML "ocirc", "ô"
addTagHTML "OElig", "Œ"
addTagHTML "oelig", "œ"
addTagHTML "Ograve", "Ò"
addTagHTML "ograve", "ò"
addTagHTML "Oslash", "Ø"
addTagHTML "oslash", "ø"
addTagHTML "Otilde", "Õ"
addTagHTML "otilde", "õ"
addTagHTML "Ouml", "Ö"
addTagHTML "ouml", "ö"
addTagHTML "Scaron", "Š"
addTagHTML "scaron", "š"
addTagHTML "szlig", "ß"
addTagHTML "THORN", "Þ"
addTagHTML "thorn", "þ"
addTagHTML "Uacute", "Ú"
addTagHTML "uacute", "ú"
addTagHTML "Ucirc", "Û"
addTagHTML "ucirc", "û"
addTagHTML "Ugrave", "Ù"
addTagHTML "ugrave", "ù"
addTagHTML "Uuml", "Ü"
addTagHTML "uuml", "ü"
addTagHTML "Yacute", "Ý"
addTagHTML "yacute", "ý"
addTagHTML "yuml", "ÿ"
addTagHTML "Yuml", "Ÿ"
addTagHTML "euro", "€"
addTagHTML "pound", "£"
addTagHTML "yen", "¥"
addTagHTML "brvbar", "¦"
addTagHTML "copy", "©"
addTagHTML "dagger", "†"
addTagHTML "Dagger", "‡"
addTagHTML "hellip", "..."
addTagHTML "iquest", "¿"
addTagHTML "lrm", "¿"
addTagHTML "mdash", "—"
addTagHTML "ndash", "–"
addTagHTML "not", "¬"
addTagHTML "ordf", "ª"
addTagHTML "ordm", "º"
addTagHTML "para", "¶"
addTagHTML "prime", "'"
addTagHTML "Prime", Chr(34)
addTagHTML "reg", "®"
addTagHTML "rlm", "®"
addTagHTML "sup1", "¹"
addTagHTML "trade", "™"
addTagHTML "rdquo", Chr(34)
addTagHTML "ldquo", Chr(34)
addTagHTML "times", "×"
addTagHTML "and", "^"
addTagHTML "micro", "µ"
addTagHTML "emsp", " "
addTagHTML "ensp", " "
addTagHTML "thinsp", " "
addTagHTML "??????", "?"
' Seta que foi carregado
blVtTagConvLoaded = True
End If
' Encontra próximo marcador inicial de TAG
lnAux(0) = InStr(1, stInput, ST_INIT_HTML_TAG)
' Enquanto encontrar marcadores iniciais
While (lnAux(0) > 0)
' Encontra marcador final
lnAux(1) = InStr(lnAux(0), stInput, ST_END_HTML_TAG)
' Verifica se encontrou
If (lnAux(1) > 0) Then
' Verifica se é válido
If ((lnAux(1) - lnAux(0)) < LN_MAX_HTML_TAG_SIZE) Then
' Pega string
stAux = Mid(stInput, lnAux(0) + 1, lnAux(1) - lnAux(0) - 1)
' Verifica se é do tipo numérico
If Mid(stAux, 1, 1) = "#" Then
' Pega a parte numérica
stAux = Mid(stAux, 2)
' Verifica se é válido
If IsNumeric(stAux) Then
' Substitui na string
stInput = Mid(stInput, 1, lnAux(0) - 1) + Chr(CLng(stAux)) + Mid(stInput, lnAux(1) + 1)
End If
Else
' Varre o vetor a procura do código correspondente
For itI = 0 To IT_HTML_TAG_CONV_SIZE
' Verifica se é este
If (vthcTagConv(itI).stSearch = stAux) Then
' Sai do laço
Exit For
End If
Next itI
' Substitui na string
stInput = Mid(stInput, 1, lnAux(0) - 1) + vthcTagConv(itI).stReplace + Mid(stInput, lnAux(1) + 1)
End If
' Localiza próximo marcador inicial de TAG
lnAux(0) = InStr(lnAux(0), stInput, ST_INIT_HTML_TAG)
Else
' Localiza próximo marcador inicial de TAG
lnAux(0) = InStr(lnAux(0) + 1, stInput, ST_INIT_HTML_TAG)
End If
Else
' Decide que não há mais marcadores iniciais
lnAux(0) = 0
End If
Wend
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Converte UTF8 para wide-string (antiga convUTF8)
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Function utf8TOwstring(stInput As String) As String
Dim stAux As String
Dim lnInPos As Long, lnInSize As Long
Dim lnAuxPos As Long
Dim lnChPos As Long
Dim btChar(2) As Byte
Dim itChar As Integer
On Error GoTo ErrTreat:
' Define o tamanho da entrada
lnInSize = Len(stInput)
' Se entrada for válida
If (lnInSize > 0) Then
' Inicia saída
stAux = String(lnInSize, 0)
' Inicia variáveis
lnInPos = 1
lnAuxPos = 1
' Enquanto não chegar ao final da string
While (lnInPos <= lnInSize)
' Seleciona o char
btChar(0) = Asc(Mid(stInput, lnInPos, 1))
' Verifica o valor
Select Case btChar(0)
' Se for ocidental
Case 0 To 127
' Executa operação
itChar = btChar(0)
' Incrementa posição
lnInPos = lnInPos + 1
' Se for unicode de nível 2
Case 128 To 223
' Seleciona próximo char
btChar(1) = Asc(Mid(stInput, lnInPos + 1, 1))
' Se valor for válido
If (btChar(1) >= 128) Then
' Executa operação
itChar = c_Bitwise.ShiftLeft((btChar(0) And 63), 6) + (btChar(1) And 127)
' Incrementa posição
lnInPos = lnInPos + 2
Else
' Define base
itChar = btChar(0)
' Incrementa posição
lnInPos = lnInPos + 1
End If
' Se for unicode de nível 3
Case Else
' Seleciona próximos chars
btChar(1) = Asc(Mid(stInput, lnInPos + 1, 1))
btChar(2) = Asc(Mid(stInput, lnInPos + 2, 1))
' Se valores forem válidos
If (btChar(1) >= 128) And (btChar(2) >= 128) Then
' Executa operação
itChar = c_Bitwise.ShiftLeft((btChar(0) And 31), 12) + c_Bitwise.ShiftLeft((btChar(1) And 127), 6) + (btChar(2) And 127)
' Incrementa posição
lnInPos = lnInPos + 3
Else
' Define base
itChar = btChar(0)
' Incrementa posição
lnInPos = lnInPos + 1
End If
End Select
' Seta char na saída
Mid$(stAux, lnAuxPos) = ChrW(itChar)
' Incrementa posição
lnAuxPos = lnAuxPos + 1
Wend
' Retorna auxiliar
utf8TOwstring = Mid(stAux, 1, (lnAuxPos - 1))
Else
' Gera saída inválida
utf8TOwstring = ST_INVALID_VALUE
End If
Exit Function
ErrTreat:
' Se houver algo no auxiliar
If (lnAuxPos > 0) Then
' Retorna auxiliar
utf8TOwstring = Mid(stAux, 1, (lnAuxPos - 1))
End If
' Gera erro
LogErrMessage Err.Description, ST_MY_NAME + ".utf8TOwstring"
End Function
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Converte uma wide-string em utf8
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Function wstringTOutf8(stInput As String) As String
Dim stAux As String
Dim lnPos As Long
Dim lnSize As Long
Dim lnI As Long
Dim itChar As Integer
On Error GoTo ErrTreat:
' Recupera tamanho da entrada
lnSize = Len(stInput)
' Verifica tamanho de entrada
If (lnSize > 0) Then
' Inicia valores
lnPos = 1
' Cria buff
stAux = String(lnSize * 3, 0)
' Varre a entrada
For lnI = 1 To lnSize
' Seleciona o caracter
itChar = AscW(Mid(stInput, lnI, 1))
' Verifica qual o caracter
Select Case itChar
' Se for simples
Case 0 To 127
' Grava direto
Mid$(stAux, lnPos) = Chr(itChar)
' Incrementa posição
lnPos = lnPos + 1
' Se for duplo
Case 128 To 2047
' Grava primeiro
Mid$(stAux, lnPos) = Chr(192 Or c_Bitwise.ShiftRight(itChar, 6))
' Incrementa posição
lnPos = lnPos + 1
' Grava segundo
Mid$(stAux, lnPos) = Chr(128 Or (itChar And 63))
' Incrementa posição
lnPos = lnPos + 1
' Se for triplo
Case Else
' Grava primeiro
Mid$(stAux, lnPos) = Chr(224 Or c_Bitwise.ShiftRight(itChar, 12))
' Incrementa posição
lnPos = lnPos + 1
' Grava segundo
Mid$(stAux, lnPos) = Chr(128 Or (c_Bitwise.ShiftRight(itChar, 6) And 63))
' Incrementa posição
lnPos = lnPos + 1
' Grava terceiro
Mid$(stAux, lnPos) = Chr(128 Or (itChar And 63))
' Incrementa posição
lnPos = lnPos + 1
End Select
Next lnI
' Retorna string
wstringTOutf8 = Mid(stAux, 1, lnPos - 1)
Else
' Retorna inválido
wstringTOutf8 = ST_INVALID_VALUE
End If
Exit Function
ErrTreat:
LogErrMessage Err.Description, ST_MY_NAME + ".wstringTOutf8"
End Function
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Converte uma wide-string em utf8-html
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Function wstringTOutf8html(stInput As String) As String
Dim stAux As String
Dim lnSize As Long
On Error GoTo ErrTreat:
' Recupera tamanho da entrada
lnSize = Len(stInput)
' Verifica tamanho de entrada
If (lnSize > 0) Then
' Transforma wstring em utf8
stAux = wstringTOutf8(stInput)
' Converte para HTML e retorna
wstringTOutf8html = stringTOhtml(stAux)
Else
' Retorna inválido
wstringTOutf8html = ST_INVALID_VALUE
End If
Exit Function
ErrTreat:
LogErrMessage Err.Description, ST_MY_NAME + ".wstringTOutf8html"
End Function
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Converte uma wide-string em utf8-html (sem caracteres minusculos)
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Function wstringTOutf8uhtml(stInput As String, lnLimit As Long) As String
Dim stAux As String
Dim lnSize As Long
On Error GoTo ErrTreat:
' Recupera tamanho da entrada
lnSize = Len(stInput)
' Verifica tamanho de entrada
If (lnSize > 0) Then
' Transforma wstring em utf8
stAux = wstringTOutf8(UCase(stInput))
' Se for maior que o limite
If (Len(stAux) > lnLimit) Then
' Retira excesso
stAux = Mid(stAux, 1, lnLimit)
End If
' Converte para HTML e retorna
wstringTOutf8uhtml = stringTOhtml(stAux)
Else
' Retorna inválido
wstringTOutf8uhtml = ST_INVALID_VALUE
End If
Exit Function
ErrTreat:
LogErrMessage Err.Description, ST_MY_NAME + ".wstringTOutf8uhtml"
End Function
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Converte uma string para formato HTML
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Function stringTOhtml(stInput As String) As String
Dim stAux As String
Dim lnPos As Long
Dim lnI As Long
Dim lnSize As Long
Dim btChar As Byte
On Error GoTo ErrTreat:
' Recupera o tamanho da entrada
lnSize = Len(stInput)
' Verifica tamanho de entrada
If (lnSize > 0) Then
' Inicia valores
lnPos = 1
' Cria buff
stAux = String(lnSize * 3, 0)
' Varre a entrada
For lnI = 1 To lnSize
' Seleciona o caracter
btChar = Asc(Mid(stInput, lnI, 1))
' Verifica qual o caracter
Select Case btChar
' Se for espaço
Case BT_SEP
' Grava 'plus'
Mid$(stAux, lnPos) = CH_SPACE_CHAR
' Incrementa posição
lnPos = lnPos + 1
' Se for caracteres válidos
Case 47 To 57, 65 To 90, 97 To 122
' Grava caracter direto
Mid$(stAux, lnPos) = Chr(btChar)
' Incrementa posição
lnPos = lnPos + 1
' Se for outros caracteres
Case Else
' Grava em hexadecimal
Mid$(stAux, lnPos) = CH_SPECIAL_CHAR + HexTwo(btChar)
' Incrementa posição
lnPos = lnPos + 3
End Select
Next lnI
' Retorna string
stringTOhtml = Mid(stAux, 1, lnPos - 1)
Else
' Retorna inválido
stringTOhtml = ST_INVALID_VALUE
End If
Exit Function
ErrTreat:
LogErrMessage Err.Description, ST_MY_NAME + ".stringTOhtml", stInput
End Function
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Converte um texto-unicode em wide-string
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function txtuniTOwstring(stInput As String) As String
Dim stAux As String
On Error GoTo ErrTreat:
' Verifica se a entrada é válida
If (Len(stInput) > LN_TXT_UNICODE) Then
' Recupera os chars de unicode
stAux = Mid(stInput, 1, LN_TXT_UNICODE)
' Verifica se pertence a algum tipo do unicode
Select Case stAux
' Se pertence
Case ST_TXT_UNICODE, ST_TXT_UNICODE2
' Converte texto para wide
txtuniTOwstring = wcharTOwstring(Mid(stInput, Len(ST_TXT_UNICODE) + 1))
' Caso não pertencer
Case Else
' Apenas retorna entrada
txtuniTOwstring = stInput
End Select
Else
' Apenas retorna entrada
txtuniTOwstring = stInput
End If
Exit Function
ErrTreat:
LogErrMessage Err.Description, ST_MY_NAME + ".txtuniTowstring"
End Function
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Converte um wide-string em texto-unicode
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function wstringTOtxtuni(stInput As String) As String
On Error GoTo ErrTreat:
' Verifica se a entrada é válida
If (Len(stInput) > 0) Then
' Converte e retorna
wstringTOtxtuni = ST_TXT_UNICODE + wstringTOwchar(stInput)
Else
' Retorna apenas início de unicode
wstringTOtxtuni = ST_TXT_UNICODE
End If
Exit Function
ErrTreat:
LogErrMessage Err.Description, ST_MY_NAME + ".wstringTotxtuni"
End Function
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Copia uma wchar para um vetor de inteiros
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Function wcharTOvtit(stInput As String) As Integer()
Dim lnI As Long
Dim vtitAux() As Integer
On Error GoTo ErrTreat:
' Se possui uma entrada válida
If (Len(stInput) > 1) Then
' Calcula o tamanho do vetor
lnI = (Len(stInput) / 2) - 1
' Redimenciona o vetor
ReDim vtitAux(lnI)
' Copia da string para o vetor
CopyMemory vtitAux(0), ByVal stInput, Len(stInput)
' Retorna
wcharTOvtit = vtitAux
End If
Exit Function
ErrTreat:
LogErrMessage Err.Description, ST_MY_NAME + ".wcharTovtit"
End Function
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Copia uma vetor de inteiros para um wchar
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Function vtitTOwchar(vtitInput() As Integer) As String
Dim lnI As Long
Dim stAux As String
On Error GoTo ErrTreat:
' Inicia variáveis
stAux = ST_INVALID_VALUE
' Calcula o tamanho da string
lnI = VtSize(vtitInput()) * 2
' Se possui um tamanho válido
If (lnI > 0) Then
' Redimenciona string
stAux = String(lnI, 0)
' Copia do vetor para a string
CopyMemory ByVal stAux, vtitInput(0), lnI
End If
' Retorna
vtitTOwchar = stAux
Exit Function
ErrTreat:
LogErrMessage Err.Description, ST_MY_NAME + ".vtitTowchar"
End Function
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Converte uma wide-char em wide-string
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function wcharTOwstring(stInput As String) As String
Dim vtitAux() As Integer
Dim lnI As Long
Dim stAux As String
On Error GoTo ErrTreat:
' Converte a entrada para um vetor de inteiros
vtitAux = wcharTOvtit(stInput)
' Recupera tamanho do vetor
lnI = VtSize(vtitAux)
' Se houve retorno
If (lnI > 0) Then
' Redimenciona string
stAux = String(lnI, 0)
' Varre o vetor
For lnI = (VtSize(vtitAux) - 1) To 0 Step -1
' Seta wchar
Mid$(stAux, lnI + 1) = ChrW(vtitAux(lnI))
Next lnI
' Retorna string
wcharTOwstring = stAux
Else
' Retorna inválido
wcharTOwstring = ST_INVALID_VALUE
End If
' Libera vetor auxiliar
Erase vtitAux()
Exit Function
ErrTreat:
LogErrMessage Err.Description, ST_MY_NAME + ".wcharTowstring"
End Function
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Converte uma wide-string em wide-char
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function wstringTOwchar(stInput As String) As String
Dim vtitAux() As Integer
Dim lnI As Long
Dim stAux As String
On Error GoTo ErrTreat:
' Calcula o tamanho do vetor
lnI = Len(stInput)
' Se for válido
If (lnI > 0) Then
' Redimenciona o vetor de inteiros
ReDim vtitAux(lnI - 1)
' Varre a string
For lnI = (Len(stInput) - 1) To 0 Step -1
' Seta os valores do vetor
vtitAux(lnI) = AscW(Mid(stInput, lnI + 1, 1))
Next lnI
' Converte em string
stAux = vtitTOwchar(vtitAux())
' Retorna
wstringTOwchar = stAux
Else
' Retorna inválido
wstringTOwchar = ST_INVALID_VALUE
End If
' Libera vetor
Erase vtitAux()
Exit Function
ErrTreat:
LogErrMessage Err.Description, ST_MY_NAME + ".wstringTowchar"
End Function