Jump to content


Photo

Escapar contenido HTML

html carácteres especiales escapar

  • Please log in to reply
9 replies to this topic

#1 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6295 posts
  • LocationArgentina

Posted 13 October 2015 - 01:31 PM

Buenas,

Estoy leyendo el contenido HTML y me he dado cuenta que necesito "escapar" los "carácteres especiales" a su valor textual de algunas partes del código. Por ejemplo reemplazar la palabra Trámite por trámite, o VILLAFA?E por VILLAFAÑE.

 

Imaginé que ya existe algo que lo haga en Lazarus pero hasta el momento mi búsqueda me ha llevado a la nada. :(

 

¿Alguien por casualidad sabe si hay algo así? ¿O en donde podría consultar la lista de estos carácteres para al menos implementar algo propio? Según veo, los únicos que necesitaría leer son los carácteres textuales (letras) ya que los símbolos (<, >, etc) no creo que aparezcan dentro del contenido que necesito recuperar.

 

Saludos,


  • 0

#2 Héctor Randolph

Héctor Randolph

    501st Legion

  • Moderadores
  • PipPipPip
  • 664 posts
  • LocationMéxico

Posted 13 October 2015 - 02:44 PM

Hola Delphius

 

Aquí puedes consultar información de estos símbolos  HTML Entities

 

Se dividen en grupos cada uno de ellos bastante extenso

 

Currency Symbols

Mathematical Operators

Arrows

Greek and Coptic

Miscellaneous Symbols

 

Saludos


  • 1

#3 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6295 posts
  • LocationArgentina

Posted 13 October 2015 - 03:13 PM

Hola Delphius

 

Aquí puedes consultar información de estos símbolos  HTML Entities

 

Se dividen en grupos cada uno de ellos bastante extenso

 

Currency Symbols

Mathematical Operators

Arrows

Greek and Coptic

Miscellaneous Symbols

 

Saludos

 

Gracias Héctor por el dato. Por lo que estuve viendo es posible que sólo necesite de los que hacen a téxtos ya que los demás símbolos no son de esperarse para mi caso. En el mismo sitio encontré la lista que necesito.

Aunque ahora que me fijo en esa lista a la Ñ dice que es &Ntilde; pero en mis HTML de muestra la veo como ? Mi explicación es que quizá sea cosa del charset... El componente que empleo es el TidHHTP y según estuve haciendo pruebas el HTML que regresa es UTF8 independientemente (y si fuera incluso otro, yo me encargo de convertirlo a éste. Lazarus ya cuenta con funciones de conversión de encode) del que se haya definido en el "código fuente" (iso-8859-1 en mi caso) de la página.

 

Saludos,


  • 0

#4 enecumene

enecumene

    Webmaster

  • Administrador
  • 7419 posts
  • LocationRepública Dominicana

Posted 13 October 2015 - 03:22 PM

Pues en Delphi (no sé en Lazarus) cuenta una unidad llamada HTTPApp, y una de sus funciones es HTMLDecode que decodifica las entidades html como el ejemplo que mencionaste de trámite, y para el segundo ejemplo Lazarus cuenta con Utf8ToAnsi, pruebalo.

 

Saludos.


  • 0

#5 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6295 posts
  • LocationArgentina

Posted 13 October 2015 - 04:19 PM

Pues en Delphi (no sé en Lazarus) cuenta una unidad llamada HTTPApp, y una de sus funciones es HTMLDecode que decodifica las entidades html como el ejemplo que mencionaste de trámite, y para el segundo ejemplo Lazarus cuenta con Utf8ToAnsi, pruebalo.

 

Saludos.

 

Pues la verdad amigo, ya me hace dudar que es lo que está pasando... O si es que el paso de UTF8 a ANSI resolverá el problema.

El caso al menos que he visto con el ejemplo es puntualmente con la Ñ, que en el código HTML devuelvo por el TidHTTP en lugar se der &Ntilde; es simplemente el signo de cierre de pregunta (es decir ?). Lo vi porque el texto que estuve leyendo es un apellido con Ñ.

 

Procedo a explicar lo que hice:

 

Tengo una app en pruebas, e implementé este código entre mis tantas pruebas:


php
  1. procedure TForm1.Button13Click(Sender: TObject);
  2. var param, html1, html2: TStringList;
  3. encode: string;
  4. begin
  5. param := TStringList.Create;
  6. html1 := TStringList.Create;
  7.  
  8. param.Add(XXX); // no puedo dar detalles
  9. param.Add(XXX); // de los parámetros
  10. param.Add(XXX); // por cuestiones de seguridad
  11.  
  12. html1.Text := idHTTP1.Post(MYURL, param);
  13. encode := GuessEncoding(html1.Text);
  14. if encode <> EncodingUTF8
  15. then begin
  16. html2 := TStringList.Create;
  17. html2.Text := ConvertEncoding(html1.Text, encode, EncodingUTF8);
  18. html2.SaveToFile(MYARCHIVO);
  19. ShowMessage('Se ha convertido a UTF8');
  20.  
  21. FreeAndNil(html2);
  22. else begin
  23. html1.SaveToFile(MYARCHIVO);
  24. ShowMessage('El html de origen es UTF8');
  25. end;
  26.  
  27. freeAndNil(param);
  28. freeAndNil(html1);

En mi prueba lo que hago es evaluar si ya de por si el contenido HTML devuelto por el TidHTTP es UTF8, de no serlo lo convierto. La prueba hecha en Windows es que efectivamente ya está en UTF8.

 

Luego abriendo el archivo y explorando noté que entre el contenido que me interesa recuperar, en una ocasión aparece la famosa ? Pero si navego el sitio con cualquier navegador muestra la Ñ. Me dije "bueno, si veo el código fuente que genera el navegador (probé con FF y Chome )quizá también vea ese símbolo de pregunta" pero no... me lo muestra como Ñ.

En FF es posible establecer el tipo de codificación al mostrar el fuente... asi que probé tanto en unicode como en occidental y ni caso... muestra Ñ. Sólo el componente TIdHTTP me pone en lugar de la Ñ el signo de pregunta.

 

Esta es una muestra de lo que regresa justamente el componente (TidHHTP) para el caso de la Ñ:


html5
  1. <td align="center" bgColor="ghostwhite" colspan="5"><b><font face="Arial, Helvetica, sans-serif" size="1" > VILLAFA?E BLANCA </font> </b></td>

Pero como pueden ver, a otras entidades lo muestra como &algo:


html5
  1. <td align="center" bgColor="gray"><font color="#FFFFFF" size="1" face="Arial, Helvetica, sans-serif">C&oacute;digo</font></td>


html5
  1. <td align="center" bgColor="gray"><font face="Arial, Helvetica, sans-serif" size="1" color="#FFFFFF">Tipo Tr&aacute;mite </font></td>

El sitio en cuestión está definido como iso-8859-1:


html5
  1. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

Por eso no se que pensar.

 

Le daría unos cuantos golpes al que diseñó el sitio, porque se nota que lo hizo tan "caseramente" que tiene algunas faltas de etiquetas que sino fuera porque los navegadores son perfectamente inteligentes y lo corrigen al vuelo el sitio se mostraría una mierda. Pero esto es otro cantar.

 

Inicialmente pensé en emplear un Parser para hacer todo el trabajo pero me di cuenta justamente que por estos defectos de diseño las cosas no funcionan... además el uso de los parsers que estuve viendo exploran todo, requieren etiquetado completo y no necesito de tanto. Además como lo mio es un trabajo por demanda y necesito consultar varias veces el mismo sitio pero con diferentes parámetros el HTML en si no varía, y sólo me bastaria con detectar los "patrones" de interes y pum... trabajo hecho. Usar el parser me obliga a estar parseando cada vez que se consulta y es una pérdida de tiempo y recursos.

 

Saludos,


  • 0

#6 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6295 posts
  • LocationArgentina

Posted 13 October 2015 - 04:34 PM

Agrego:

 

Entre algunas de las tantas pruebas que estoy aplicando hice esto:


delphi
  1. procedure TForm1.Button11Click(Sender: TObject);
  2. begin
  3. ShowMessage(GetDefaultTextEncoding);
  4. end;

La función en cuestión regresa el default encode empleado por el SO. Naturalmente en Windows regresa cp1252, que representa Windows-1252.

 

Pero internamente Lazarus ya opera en UTF8 por defecto. Y los componentes, al menos hasta el momento todos los que he empleado, así lo hacen.

Yo en modo "por las dudas", hice esa prueba de conversión en caso de que TidHTTP no regrese el HTML en UTF8 y aplica perfectamente su trabajo. La prueba arroja el cartelito de que ya está en UTF8 y no hizo falta.

 

Sólo por las dudas abro el texto HTML guardado con Notepad++ en lugar del bloc de notas a ver si no hay por ahi algún engaño pero no... se ve claro el símbolo de pregunta en el HTML devuelto por el componente y que éste identifica la codificación: UTF8 sin BOM.

 

El otro motivo por el cual se busca seguir UTF8 es porque es un formato "universal".

 

Lo que me quedaría por probar es diseñar una página HTML básica y listar diferentes caracteres y poner al TIdHTTP a navegar y ver que genera... asi podría descartar otras sorpresas.

 

 

Saludos,


  • 0

#7 enecumene

enecumene

    Webmaster

  • Administrador
  • 7419 posts
  • LocationRepública Dominicana

Posted 13 October 2015 - 05:57 PM

La falla está en la web ya que el charset está asignado como ISO-8859-1 y su base de datos está codificada como UTF8 ahí está la contradicción, el signo ? está doble codificada.

Saludos.
  • 0

#8 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6295 posts
  • LocationArgentina

Posted 13 October 2015 - 06:15 PM

La falla está en la web ya que el charset está asignado como ISO-8859-1 y su base de datos está codificada como UTF8 ahí está la contradicción, el signo ? está doble codificada.

Saludos.

 

¡Jodeme! ¡Santa torre de Babel! 8o| :D

 

Entonces... ¿como podría prevenir cualquier metida de pata desde ese lado? :(  Porque si con la Ñ hace eso, ya me estoy imaginando lo que sucederá con apellidos como D'Andrea, Lapegüe, Zvitövich (este me lo inventé :p ) No se si forzar a hacer un ISO_8859_1ToUTF8() al HTML generado medio solucionará la cosa. Seguro que ya me apagaron el server y deberé esperar hasta mañana para hacer más pruebas.

 

Lo que encontré en esta página alemana me ha dejado carburando que quizá la lectura de las entidades es idependiente como dicen. Y en los casos en lo que el contenido a leer sea extraído desde la base de datos (lo que en realidad más me interesa recuperar) habrá que jugar con algo más...

 

Tengo unas ganas de ir a darle una visita nada amigable al encargado de dicho sitio (y de toda el área de sistemas de la organización) 8o|  ... lo peor de todo es que lo conozco y me extraña que sea tan "desprolijo".

 

Saludos,


  • 0

#9 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6295 posts
  • LocationArgentina

Posted 14 October 2015 - 02:21 PM

Pues no tengo idea de hacia donde apuntar para lidiar con casos como el de la Ñ vs ?

¿Alguien tiene algún norte? :(

 

No quisiera pensar que podría haber algún bug en el Indy... se que Indy tiene un historial de fallo y muchos recomiendan emplear la v10. Desconozco si la que dispongo sea esa, más hasta lo que veo desde el Typhon Center dice que tengo Indy SVN del 24/10/2014 Rev 5201.

 

AGREGO:

Acabo de iniciar un hilo en el foro de Lazarus sobre este problema a ver si se animan más ojos a ver el tema.

 

 

Saludos,


  • 0

#10 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6295 posts
  • LocationArgentina

Posted 15 October 2015 - 02:44 PM

Hola a todos!

Ya estoy en condiciones de dar una posible solución. Tendría que hacer más pruebas pero hasta ahora todo marcha bien.

 

La solución vino por el usuario CrisF del foro de Lazarus quien amablemente me explicó el asunto. Resulta ser que no tiene nada que ver la codificación de la base de datos sino en la conversión interna que aplica Indy. La solución es justamente capturar el codigo fuente original antes de que Indy proceda con su encoding.

Luego a este fuente original hay que proceder a aplicar el encode desde el tipo definido en META hacia UTF8. En este caso: de ISO 8859-1 a UTF8.

 

¿Cómo capturar el HTML original? incovando a otro de los métodos Post sobrecargados y para ello disponemos de un TStringStream:


delphi
  1. param := TStringList.Create;
  2. param.Add('param1=value1');
  3. param.Add('param2=value2');
  4. param.Add('param3=value3');
  5.  
  6. stream := TStringStream.Create('');
  7. idHTTP1.Post(MYURL, param, stream);
  8. memo1.Text := ISO_8859_1ToUTF8(Stream.DataString);
  9.  
  10. FreeAndNil(param);
  11. FreeAndNil(stream);

El hilo sobre el tema en el foro de Lazarus por si les resulta de interés es éste.

 

Saludos,


  • 0





Also tagged with one or more of these keywords: html, carácteres especiales, escapar

IP.Board spam blocked by CleanTalk.