** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - texto a UTF-16/ unicode
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradotexto a UTF-16/ unicode

 Responder Responder
Autor
Mensaje
walter1972 Ver desplegable
Nuevo
Nuevo


Unido: 27/Mayo/2007
Localización: Argentina
Estado: Sin conexión
Puntos: 25
Enlace directo a este mensaje Tema: texto a UTF-16/ unicode
    Enviado: 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 
Arriba
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 1510
Enlace directo a este mensaje Enviado: 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.
Arriba
walter1972 Ver desplegable
Nuevo
Nuevo


Unido: 27/Mayo/2007
Localización: Argentina
Estado: Sin conexión
Puntos: 25
Enlace directo a este mensaje Enviado: 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 ??

Arriba
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 1510
Enlace directo a este mensaje Enviado: 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/
Arriba
walter1972 Ver desplegable
Nuevo
Nuevo


Unido: 27/Mayo/2007
Localización: Argentina
Estado: Sin conexión
Puntos: 25
Enlace directo a este mensaje Enviado: 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
Arriba
walter1972 Ver desplegable
Nuevo
Nuevo


Unido: 27/Mayo/2007
Localización: Argentina
Estado: Sin conexión
Puntos: 25
Enlace directo a este mensaje Enviado: 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 
Arriba
mounir Ver desplegable
Colaborador
Colaborador


Unido: 09/Febrero/2009
Localización: Asturias-España
Estado: Sin conexión
Puntos: 6479
Enlace directo a este mensaje Enviado: 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

Editado por mounir - 19/Enero/2021 a las 12:30
Un Saludo.
Arriba
walter1972 Ver desplegable
Nuevo
Nuevo


Unido: 27/Mayo/2007
Localización: Argentina
Estado: Sin conexión
Puntos: 25
Enlace directo a este mensaje Enviado: 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
Arriba
walter1972 Ver desplegable
Nuevo
Nuevo


Unido: 27/Mayo/2007
Localización: Argentina
Estado: Sin conexión
Puntos: 25
Enlace directo a este mensaje Enviado: 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
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable