Imprimir página | Cerrar ventana

texto a UTF-16/ unicode

Impreso de: Foro de Access y VBA
Categoría: Access y VBA
Nombre del foro: Access y VBA
Descripción del foro: Foro de programacion en Access (Con código y sin código)
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=84493
Fecha de impresión: 29/Marzo/2024 a las 09:29


Tema: texto a UTF-16/ unicode
Publicado por: walter1972
Asunto: texto a UTF-16/ unicode
Fecha de publicación: 13/Mayo/2019 a las 22:49
hola buen día,  tengo un cuadro de texto normal y quiero convertirlo a hexadecimal 
tengo la funcion HEX que funciona ok si pongo solo texto por ejemplo 

Hola = 68006F006C0061 /// esto va ok 

ahora el problema es si pongo un emojis por ejemplo Smile me devuelve = 003D00D8000A  cuando en realidad tendría que devolver : D83DDE0A  

los emojis los pongo con el teclado de windows 10 /  tecla "Windows + ."  la cual tiene emojis

la función que copie de Internet y uso para enviar mensajes SMS x PDU   :



Dim MiCadenaDeBytes() As Byte
MiCadenaDeBytes = Text29 ' aca el texto comun 
For i = LBound(MiCadenaDeBytes) To (UBound(MiCadenaDeBytes) - 1)

If Not hex(MiCadenaDeBytes(i)) = 0 Then
If hex(MiCadenaDeBytes(i)) = "AC" Then
mensaje = mensaje & "20" & Left(hex(MiCadenaDeBytes(i)), 4)
Else
If hex(MiCadenaDeBytes(i)) = "D" Then
mensaje = mensaje & "000" & Left(hex(MiCadenaDeBytes(i)), 4) '
Else
If hex(MiCadenaDeBytes(i)) = "A" Then
mensaje = mensaje & "000" & Left(hex(MiCadenaDeBytes(i)), 4)
Else
mensaje = mensaje & "00" & Left(hex(MiCadenaDeBytes(i)), 4) 
End If
End If
End If
End If
Next

texto30=mensaje ' aca tendria que devolver D83DDE0A la caritaSmile 



Respuestas:
Publicado por: pitxiku
Fecha de publicación: 16/Mayo/2019 a las 18:54
Una posibilidad es usar JavaScript, que tiene más posibilidades de trabajo con texto Unicode (u otro tipo de lenguaje de programación), y usarlo desde Access.

Un pequeño ejemplo:

- https://1drv.ms/u/s!AsYMk9OS3HACiEW5MsT-72QhjAFO

En el formulario hay incrustado un control ScriptControl para poder usar la función JavaScript que se agrega por código, y a partir de ahí se le llama con el texto a codificar y se recupera el resultado.


Publicado por: walter1972
Fecha de publicación: 17/Mayo/2019 a las 14:27
hola de nuevo el ejemplo funciona Ok con los emojis Smile solos , ahora el problema es con el texto lo devuelve pero no lo pone con los 00 adelante intente cambiar el codigo con ejemplos de google y me pone 00 al  D83DDE0A

texto ahora queda 686f6c61 tendria que quedar 0068006F006C0061 porque sino llegan caracteres chinos

si modifico el codigo de java "del cual no tengo idea" modifica tambien  el D83DDE0A y pone 0083003d00de000a Angry con lo cual no llega nada solo ??



Publicado por: pitxiku
Fecha de publicación: 18/Mayo/2019 a las 17:15
Puedes controlar la longitud del código hexadecimal, y agregar ceros en consecuencia. El ejemplo actualizado:

- https://1drv.ms/u/s!AsYMk9OS3HACiEW5MsT-72QhjAFO

Otra posibilidad, dependiendo de dónde estás usando el Unicode, es colocar el identificador "U+" delante de cada código, para que el programa sepa que es un código Unicode.

Y otra posibilidad, más "pesada" al principio, es crear una tabla con 2 campos, uno para el carácter y otro para el código Unicode, y luego se tratará sólo de hacer una búsqueda:

- https://unicode-table.com/es/


Publicado por: walter1972
Fecha de publicación: 20/Mayo/2019 a las 13:32
muchas gracias funciono ok con la primera solucion  / no sabia que javascrip se podia ejecutar desde ms access estuve buscando la solucion en VBA y nada . de nuevo muchas graciasSmile


Publicado por: walter1972
Fecha de publicación: 17/Enero/2021 a las 15:55
Hola buen día , hace un tiempo me facilitaron este ejemplo el cual funciona perfectamente en javascrip codificando texto en hexadecimal . ahora necesito hacer lo contrario pasar de hexadecimal a texto por ejemplo 0048006F006C006100200063006F006D006F00200065007300740061006D006F007300200061006C006C00ED0020D83DDE00
seria en texto " Hola como estamos allí Gran sonrisa"  
el código anterior en javascrip es el siguiente pero no tengo idea como hacer para invertir el mismo :

function codificar(texto) {
var destino = "";
for (l = 0; l < texto.length; l++) {
var s = texto.charCodeAt(l).toString(16);
switch (s.length) {
case 1:
destino += "000" + s;
break;
case 2:
destino += "00" + s;
break;
case 3:
destino += "0" + s;
break;
default:
destino += s;
}
}
    return destino;
}


muchas gracias 


Publicado por: mounir
Fecha de publicación: 19/Enero/2021 a las 12:19
Hola!
Cualquiera de estas dos funcioness funciona.

En un módulo pega esta función;-

Public Function Hex2ASCII(strInput As Variant) As Variant

    'if field is null then exit function
    If IsNull(strInput) Then Exit Function
    'make number of digits even
    If Len(strInput) / 2 <> Int(Len(strInput) / 2) Then strInput = "0" & strInput
    'convert hex codes to ASCII
    For i = 1 To Len(strInput) Step 2
        Hex2ASCII = Hex2ASCII & Chr(Val("&H" & Mid(strInput, i, 2)))
    Next i

End Function



Public Function hex2ascii1(ByVal hextext As String) As String
    
For y = 1 To Len(hextext)
    num = Mid(hextext, y, 2)
    Value = Value & Chr(Val("&h" & num))
    y = y + 1
Next y

hex2ascii1 = Value
End Function


y luego en un campo texto en su origen de control pones:-

= Hex2ASCII([Nombredetucampo])
o
= Hex2ASCII1([Nombredetucampo])


Espero que te sirva

-------------
Un Saludo.


Publicado por: walter1972
Fecha de publicación: 19/Enero/2021 a las 16:15
Hola de nuevo muchas gracias por las funciones . 
Me sucede algo extraño que nunca antes vi , ya había bajado otras funciones y con todas me sucede lo mismo inclusive algunas que no son en VBA .  
A ver si me se explicar : el resultado de la función no aparece en el cuadro de texto pero si hago clic en el cuadro  si veo parte del resultado medio truncado , pero no me lo deja usarlo, ni copiar ni nada es como que esta pero no es utilizable . si saco el control del cuadro de texto desaparece . 
Copie todo en otra base de datos pero pasa lo mismo .
Si busco un decodificador web funciona perfecto con un decodificador UTF-16 BE se ve que el código HEX esta bien pero no puedo solucionar que es lo que pasa que no decodifica bien el HEX y por eso el resultado no es el correcto.

Muchas Gracias


Publicado por: walter1972
Fecha de publicación: 24/Enero/2021 a las 20:28
La solución la encontré con el siguiente código :

Public Function Decode16(ByVal Code As String) As String

Const Size As Integer = 4
Dim Text As String
Dim Index As Integer
For Index = 0 To Len(Code) \ Size - 1
Text = Text & ChrW("&H" & Mid(Code, 1 + Index * Size, Size))
Next
Decode16 = Text
End Function


se puede cerrar el tema . muchas gracias



Imprimir página | Cerrar ventana