Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: 79137913 en 18 Noviembre 2013, 14:13 pm



Título: [FUNCION] IsUnicode (Determina si una cadena contiene caracteres unicode o no)
Publicado por: 79137913 en 18 Noviembre 2013, 14:13 pm
HOLA!!!

En fin esta funcion lo que hace es determinar si una cadena contiene caracteres unicode (si contiene unicode envia true sino false)

Ustedes diran... para que sirve esto, bueno, resulta que hay apis que solo soportan entrada ascii, entonces conesto prevenimos crasheos, en el ejemplo que arme hay un archivo con nombre de fichero unicode (un caracter RLO 202E).

Código
  1. Private Function IsUnicode(expression As String) As String
  2. 'by 79137913
  3.    Dim b() As Byte 'Se crea un array de bytes para almacenar el string
  4.    Dim Aux As String 'se usara para comparar
  5.    b = expression 'se usa un evil type convert para obtener todos los ascii de los caracteres de la expresion en las posiciones del array
  6.    For x = 0 To UBound(b) Step 2
  7.        Aux = Aux & Chr(b(x)) 'reconstruimos la expresion
  8.    Next
  9.    IsUnicode = (expression <> Aux) 'asignamos a IsUnicode el resultado de la comparacion
  10.    'Si expression es = a aux dara Falso por que expression es totalmente Ascii, sino dara Verdadero por que contiene algun caracter Unicode.
  11. End Function

El ejemplo lo descargan de aca:
http://www.mediafire.com/download/76yuudmsnnoykau/IsUnicode.rar

GRACIAS POR LEER!!!


Título: Re: [FUNCION] IsUnicode (Determina si una cadena es unicode o no)
Publicado por: Karcrack en 18 Noviembre 2013, 15:04 pm
Código
  1. Private Function IsUnicode(ByRef sStr As String) As Boolean
  2.    IsUnicode = True
  3. End Function
>:D Todas las cadenas de VB6 son UNICODE. Tú lo que estás comprobando es que no se haya hecho una doble conversión UNICODE->UNICODE. Una forma más simple de hacer esa comprobación es con StrConv.

Si pasas la cadena como ByVal a un API ésta será convertida automáticamente a ASCII y se pasará el puntero. Si la pasas como ByRef se pasará la referencia al BSTR. Si lo que quieres pasar es una referencia a la cadena en UNICODE puedes usar StrConv() o bien pasar el argumento como ByVal Long y usar StrPtr().

¿Qué código te genera esa cadena malformada?


Título: Re: [FUNCION] IsUnicode (Determina si una cadena es unicode o no)
Publicado por: Danyfirex en 18 Noviembre 2013, 16:25 pm
Yo lo veo de esta forma a ver si estoy correcto. seria ASCII si es un byte array

Código
  1. Dim cadenaASCII(4) As Byte
  2. Dim cadenaUnicode As String
  3.  
  4. 'esta seria ASCII
  5. cadenaASCII(0) = Asc("H")
  6. cadenaASCII(1) = Asc("o")
  7. cadenaASCII(2) = Asc("l")
  8. cadenaASCII(3) = Asc("a")
  9. cadenaASCII(4) = 0
  10. 'esta seria Unicode
  11. cadenaUnicode = "Hola" ' con doble terminacion nula.
  12.  

corrijanme si me equivoco
saludos


Título: Re: [FUNCION] IsUnicode (Determina si una cadena es unicode o no)
Publicado por: 79137913 en 18 Noviembre 2013, 16:26 pm
HOLA!!!

Gracias Karcrack!

Ningun codigo genera cadena malformada, pero por ejemplo yo quiero abrir un archivo con un caracter unicode en su path y eso hace crashear a las apis...

Fijate El ejemplo que puse ahi lo vas a entender.-

Dany, para que sea mas correcto deberias usar 2 posiciones del array por caracter, en la primera su ascii y en la segunda 0, al final 0 0

Osea:
Código
  1.    Dim cadenaASCII(9) As Byte
  2.    Dim cadenaUnicode As String
  3.  
  4.    'esta seria ASCII
  5.    cadenaASCII(0) = Asc("H")
  6.    cadenaASCII(1) = 0
  7.    cadenaASCII(2) = Asc("o")
  8.    cadenaASCII(3) = 0
  9.    cadenaASCII(4) = Asc("l")
  10.    cadenaASCII(5) = 0
  11.    cadenaASCII(6) = Asc("a")
  12.    cadenaASCII(7) = 0
  13.    cadenaASCII(8) = 0
  14.    cadenaASCII(9) = 0
  15.    'esta seria Unicode
  16.    cadenaUnicode = "Hola" ' con doble terminacion nula.
   

GRACIAS POR LEER!!!


Título: Re: [FUNCION] IsUnicode (Determina si una cadena contiene caracteres unicode o no)
Publicado por: Karcrack en 18 Noviembre 2013, 16:44 pm
Entonces estás usando versiones ASCII de las APIs... Llama a la versión UNICODE. No entiendo como te ayudaría esta función a llamar a esas APIs ASCII...

@Danyfirex: cadenaASCII será ASCII siempre pero cadenaUNICODE estará en memoria como UNICODE y dependiendo de qué hagas con ella se transformará o no.


Título: Re: [FUNCION] IsUnicode (Determina si una cadena contiene caracteres unicode o no)
Publicado por: Danyfirex en 18 Noviembre 2013, 16:54 pm
@ ahora si me confundí :S



Código
  1. 'esta seria ASCII
  2.    cadenaASCII(0) = Asc("H")
  3.    cadenaASCII(1) = 0
  4.    cadenaASCII(2) = Asc("o")
  5.    cadenaASCII(3) = 0
  6.    cadenaASCII(4) = Asc("l")
  7.    cadenaASCII(5) = 0
  8.    cadenaASCII(6) = Asc("a")
  9.    cadenaASCII(7) = 0
  10.    cadenaASCII(8) = 0
  11.    cadenaASCII(9) = 0

me parece que de esa forma se structura las cadenas unicode 2 byte por carácter y en Ascii un byte por carácter. o no ?


@Karcrack por eso digo que esta byte array quedaria en memoria como una cadena unicode o no?


Título: Re: [FUNCION] IsUnicode (Determina si una cadena contiene caracteres unicode o no)
Publicado por: 79137913 en 18 Noviembre 2013, 18:04 pm
HOLA!!!

Entonces estás usando versiones ASCII de las APIs... Llama a la versión UNICODE. No entiendo como te ayudaría esta función a llamar a esas APIs ASCII...

@Danyfirex: cadenaASCII será ASCII siempre pero cadenaUNICODE estará en memoria como UNICODE y dependiendo de qué hagas con ella se transformará o no.


Esta funcion la uso para llamar a las unicode cuando corresponde y a las ascii cuando corresponde.-

Aunque podria siempre llamar a la unicode pero no me agrada la idea.-

GRACIAS POR LEER!!!


Título: Re: [FUNCION] IsUnicode (Determina si una cadena contiene caracteres unicode o no)
Publicado por: Karcrack en 18 Noviembre 2013, 19:13 pm
@Karcrack por eso digo que esta byte array quedaria en memoria como una cadena unicode o no?
Código
  1. Dim cadenaASCII(4) As Byte
  2. Dim cadenaUnicode As String
  3.  
  4. 'esta seria ASCII
  5. cadenaASCII(0) = Asc("H")
  6. cadenaASCII(1) = Asc("o")
  7. cadenaASCII(2) = Asc("l")
  8. cadenaASCII(3) = Asc("a")
  9. cadenaASCII(4) = 0
  10.  
Ese array quedaría como cadena ASCII en memoria. Si intercalas un byte nulo entre cada carácter sería UNICODE.


Título: Re: [FUNCION] IsUnicode (Determina si una cadena contiene caracteres unicode o no)
Publicado por: LeandroA en 18 Noviembre 2013, 19:15 pm
Buena 79137913, una pregunta como haces para ponerle ese nombre en unicode a los archivos?


Título: Re: [FUNCION] IsUnicode (Determina si una cadena contiene caracteres unicode o no)
Publicado por: burbu_1 en 18 Noviembre 2013, 19:27 pm
Buena 79137913, una pregunta como haces para ponerle ese nombre en unicode a los archivos?

prueba con alt + 0160   ;D


Título: Re: [FUNCION] IsUnicode (Determina si una cadena contiene caracteres unicode o no)
Publicado por: 79137913 en 18 Noviembre 2013, 19:41 pm
HOLA!!!

Uso un caracter RLO(202E):
http://www.fileformat.info/info/unicode/char/202E/index.htm

Tenes varias maneras para conseguir los caracteres Unicode, yo lo que hago es copiarlos de algun texto que lo contenga, o con el mapa de caracteres, luego lo copias y lo pegas donde quieras.-

Desde VB podes usar ChrW(8238) para generar el Caracter RLO (8238 = 202E)

GRACIAS POR LEER!!!


Título: Re: [FUNCION] IsUnicode (Determina si una cadena contiene caracteres unicode o no)
Publicado por: burbu_1 en 18 Noviembre 2013, 19:53 pm
entiendo el sentido que has dado a la función  ;-) ;-) ;-)

pero creo que  no sirve para estos símbolos.... ya que el 2º byte no es un 0 y los chinos tambien usan vb

saludos


Título: Re: [FUNCION] IsUnicode (Determina si una cadena contiene caracteres unicode o no)
Publicado por: Danyfirex en 18 Noviembre 2013, 22:19 pm
Ese array quedaría como cadena ASCII en memoria. Si intercalas un byte nulo entre cada carácter sería UNICODE.

@Karcrack me refiero a este que coloca 79137913 seria UNICODE. no ASCII.

Código
  1. 'esta seria ASCII
  2.    cadenaASCII(0) = Asc("H")
  3.    cadenaASCII(1) = 0
  4.    cadenaASCII(2) = Asc("o")
  5.    cadenaASCII(3) = 0
  6.    cadenaASCII(4) = Asc("l")
  7.    cadenaASCII(5) = 0
  8.    cadenaASCII(6) = Asc("a")
  9.    cadenaASCII(7) = 0
  10.    cadenaASCII(8) = 0
  11.    cadenaASCII(9) = 0
?


@79137913  ya entendí el propósito de la función esta muy buena.

entonces si usas GetModuleFileNameW ya sabes que el carácter sera unicode. así diga "hola"  o "Unicode ▀gpj"

básicamente lo que haces es deformar la cadena unicode. porque le estas quitando el segundo byte. aunque igual el vb6 le seguirá agregando el byte nulo automáticamente(exepto en el caracter unicode 8238 q lo estas convirtiendo en "R") porque Aux sigue siendo de tipo string.


saludos


Título: Re: [FUNCION] IsUnicode (Determina si una cadena contiene caracteres unicode o no)
Publicado por: 79137913 en 19 Noviembre 2013, 17:21 pm
HOLA!!!

Exacto chicos, ya entendieron para que sirve :D.

Determina si algun caracter de la cadena es unicode y no puede ser transformado a ascii.-

GRACIAS POR LEER!!!


Título: Re: [FUNCION] IsUnicode (Determina si una cadena contiene caracteres unicode o no)
Publicado por: Karcrack en 19 Noviembre 2013, 18:35 pm
Ya entiendo :-[

En ese caso sería mucho mejor y de coste constante hacer esto:
Código
  1. Private Function IsUnicode(ByRef s As String) As Boolean
  2.    IsUnicode = (Len(s) <> LenB(s))
  3. End Function


Título: Re: [FUNCION] IsUnicode (Determina si una cadena contiene caracteres unicode o no)
Publicado por: 79137913 en 19 Noviembre 2013, 19:14 pm
HOLA!!!

No, Karcrack, es extraño que diga esto pero tu enfoque esta errado...

TODAS las cadenas de Vb6 son almacenadas como Unicode por ende siempre LenB sera el doble de Len. Por ende tu funcion siempre da Verdadero.-

Eso de los Arrays que daban como ejemplo solo desvirtua el tema.

--------------------------------------------------------------------------------------------------

A tomar en cuenta, Mi funcion como dicen antes lo que hace es Copiar erroneamente las cadenas unicode a una nueva cadena, la cual difiere si hay algun caracter que ocupe mas de un byte, como veras en la parte del for (Step 2 y CHR), pierdo el segundo byte de cada caracter y ademas lo convierto con la funcion Chr que no devuelve mas que ascii.-

No quiero decir en ningun momento que las cadenas que se evaluan estan guardadas o no como Unicode, el alma de la funcion es ver si la cadena que se entrega es imprimible o no en ascii.-

GRACIAS POR LEER!!!


Título: Re: [FUNCION] IsUnicode (Determina si una cadena contiene caracteres unicode o no)
Publicado por: Karcrack en 19 Noviembre 2013, 20:35 pm
Tienes toda la razón. Me he contradicho a mí mismo entre el primer comment que hice y éste jaja No doy pie con bola xD

Aquí está todo explicado:
http://support.microsoft.com/KB/138142


Título: Re: [FUNCION] IsUnicode (Determina si una cadena contiene caracteres unicode o no)
Publicado por: Danyfirex en 19 Noviembre 2013, 20:54 pm
cuando dije deformas no lo dije en mal sentido :) (por si lo tomaste a mal)


y gracias por la función realmente es muy útil.

 saludos sietenueveunotressietenueveunotres(79137913)  ;D