vb código chino confuso
El nuevo módulo se llama Module_UTF8:
Opción explícita
Público m_bIsNt As Boolean
Función de declaración pública WideCharToMultiByte Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long, ByRef lpMultiByteStr As Any, ByVal cchMultiByte As Long, ByVal lpDefaultChar As String, ByVal lpUsedDefaultChar As Long) As Long
Función de declaración pública MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByRef lpMultiByteStr As Any, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar Mientras) Mientras
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpvDest como cualquiera, lpvSource como cualquier, ByVal cbCopy As Long)
Const pública CP_UTF8 = 65001
'Propósito: Convertir Utf8 a Unicode
Función pública UTF8_Decode(ByVal sUTF8 como cadena) Como cadena
Dim lngUtf8Size As Long
Dim strBuffer como cadena
Dim lngBufferSize como largo
Dim lngResult como
Dim bytUtf8() como byte
Dim n como Long
Si LenB(sUTF8) = 0, entonces salga de la función
Si m_bIsNt entonces
Si m_bIsNt entonces
En caso de error, vaya a EndFunction
bytUtf8 = StrConv(sUTF8, vbFromUnicode)
lngUtf8Size = UBound(bytUtf8) 1
Ir a 0 en caso de error
' es el Búfer de configuración de cadena de caracteres más largo posible, es decir, cada byte es
0.
Por ejemplo, cada byte es un byte ANSI, por lo que hay 1 Unicode (2 bytes) por carácter utf-8.
lngBufferSize = lngUtf8Size * 2
strBuffer = String$(lngBufferSize, vbNullChar)
'Usar página de códigos 65001 (UTF-8)
lngResult = MultiByteToWideChar(CP_UTF8, 0, bytUtf8(0), _
lngUtf8Size, StrPtr(strBuffer), lngBufferSize)
'Recorta el resultado a la longitud real
If lngResult Then
UTF8_Decode = Left$(strBuffer, lngResult)
End If
Else
Atenuar i As Long
Atenuar TopIndex mientras
Atenuar TwoBytes(1) como byte
Atenuar ThreeBytes(2) como byte
Atenuar AByte comoAtenuar AByte como byte< / p>
Dim TStr As String
Dim BArray() As Byte
'Continuar en caso de error, en caso de que alguien ingrese texto con acentos
' El texto debe estar codificado como UTF-8
Si ocurre un error, continúa con el siguiente paso
TopIndex = Len (sUTF8) 'El número de bytes es igual a TopIndex 1 p>
Si TopIndex = 0, salga de la función 'Si no hay contenido para convertir, salga de la función
BArray = StrConv(sUTF8, vbFromUnicode)
i = 0 'Inicializar el puntero
TopIndex = TopIndex - 1
' Recorrer la matriz de bytes
Hacer mientras i lt = TopIndex
AByte = BArray(i)
Si AByte lt; amp H80 Entonces
' Caracteres ANSI normales - utilizar tal cual
TStr = TStr Chr$(AByte ).i = i 1 ' Incrementa el índice de matriz de bytes
ElseIf AByte gt; = amp HE0 Then 'was = amp HE1 Then
' Inicio de UTF-8 de 3 bytes; grupo de caracteres
'Copiar 3 bytes a ThreeBytes
ThreeBytes(0) = BArray(i): i = i 1
ThreeBytes(1) = BArray (i): i = i 1
ThreeBytes(2) = BArray(i): i = i 1
ThreeBytes(2) = BArray(i): i = i 1
' Comienzo de un grupo de caracteres UTF-8 de 3 bytes
' 1
' Convierte la matriz de bytes a UTF-16 y luego a Unicode
TStr =
TStr amp; ChrW$((ThreeBytes(0) Y amp; HF) * amp; H1000 (ThreeBytes(1) Y amp; H3F) * amp; H40 (ThreeBytes(2) Y amp; H3F))
ElseIf (AByte gt; = amp; HC2) And (AByte lt; = amp; HDB) Then
' Inicio del grupo de caracteres UTF-8 de 2 bytes
TwoBytes (0) = BArray(i): i = i 1
TwoBytes(1) = BArray(i): i = i 1
' Convertir matriz de bytes a UTF-16 Luego convertido a Unicode
TStr = TStr amp ChrW$((TwoBytes(0) Y amp; H1F) * amp; H40 (TwoBytes(1) Y amp; H3F))
Else
' Caracteres ANSI normales: utilizar tal cual
TStr = TStr amp Chr$(AByte): i = i 1 ' Incrementar el índice de matriz de bytes
End If
Bucle
UTF8_Decode = TStr ' Devuelve la cadena de resultado
Borrar BArray
End If
EndFunction:
Función final
'Propósito: Convertir una cadena Unicode a UTF-8. '
Función pública UTF8_Encode(ByVal strUnicode como cadena, ByVal bHTML opcional como booleano = True) Como cadena
Dim i As Long
Dim TLen As Long
Dim lPtr As Long
Dim UTF16 As Long
Dim UTF8_EncodeLong As String
TLen = Len(strUnicode)
Si TLen = 0, entonces salga de la función
Si m_bIsNt entonces
Atenuar lngBufferSize mientras
Atenuar lngResult mientras
Atenuar bytUtf8 () As Byte
'Establece un búfer para la cadena más larga posible.
lngBufferSize = TLen * 3 1
ReDim bytUtf8(lngBufferSize - 1)
'Utilice la página de códigos 65001 (UTF-8) para la traducción.
lngResult = WideCharToMultiByte(CP_UTF8, 0, StrPtr(strUnicode), _
TLen, bytUtf8(0), lngBufferSize, vbNullString, 0)
' El El resultado se recorta a la longitud real.
Si lngResult Entonces
lngResult = lngResult - 1
ReDim Preserve bytUtf8(lngResult)
' CopyMemory StrPtr(UTF8_Encode), bytUtf8 (0amp;), lngResult
UTF8_Encode = StrConv(bytUtf8, vbUnicode)
' Para i = 0 To lngResult
' p> ' UTF8_Encode = UTF8_Encode amp ;Chr$(bytUtf8(i))
' Siguiente paso
Finalizar si
Si no
For i = 1 To TLen
' Obtiene el valor UTF-16 de caracteres Unicode
lPtr = StrPtr(strUnicode) ((i - 1) * 2)
CopyMemory UTF16, ByVal lPtr , 2
'Convertir a UTF-8
Si UTF16 lt.amp;H80 Entonces ' 1 byte UTF-8
UTF8_EncodeLong = Chr$(UTF16 )
ElseIf UTF16 lt; amp; H800 Then ' 2 UTF-8 bytes
UTF8_EncodeLong = Chr $(amp; H80 (UTF16 And amp; H3F)) ' Mínimo válido 6 bits
UTF16 = UTF16 \ H40 'Desplazar a la derecha 6 bits
UTF8_EncodeLong = Chr$(amp.HC0 (UTF16 y H1F)) UTF8_EncodeLong 'Usar los 5 bits restantes
De lo contrario ' 3 UTF-8 bytes
UTF8_EncodeLong = Chr$(amp;H80 (UTF16 And amp;H3F)) 'Mínimo válido 6 bits
p>
UTF16 = UTF16 \ H40 ' Desplazamiento a la derecha 6 bits
UTF8_EncodeLong = Chr$(H80 (UTF16 y H3F)) UTF8_EncodeLong = Chr$(H80 (UTF16 y amp; H3F)) amp UTF8_EncodeLong 'Usar los siguientes 6 bits p>
UTF16 = UTF16 \ amp;H40 'Desplazamiento a la derecha 6 bits
UTF8_EncodeLong = Chr$(amp; HE0 (UTF16 Y amp; HF )) amp UTF8_EncodeLong 'Usa los 4 bits restantes
Finalizar si
UTF8_Encode = UTF8_Encode amp UTF8_EncodeLong
Siguiente
p>
Finalizar si
'Sustituir vbCode =
UTF8_Encode & UTF8_EncodeLong
Siguiente
Fin si
'Sustituya vbCrLf con saltos de línea HTML si se solicita.
Si bHTML Entonces
UTF8_Encode = Reemplazar$(UTF8_Encode, vbCrLf, "lt;br/gt;")
Finalizar si
Finalizar función