Problemas de codificación HTML-carácter" Â " que aparece en lugar de " "


Tengo una aplicación heredada que acaba de empezar a portarse mal, por cualquier razón no estoy seguro. Genera un montón de HTML que ActivePDF convierte en informes PDF.

El proceso funciona así:

  1. Extrae una plantilla HTML de una base de datos con tokens para ser reemplazados (por ejemplo, "~CompanyName~", "~CustomerName~", etc.)
  2. Reemplace los tokens con datos reales
  3. Ordenar el HTML con una función regex simple que la propiedad formatea los valores de atributo de etiqueta HTML (asegura comillas, etc., ya que el motor de renderizado de ActivePDF odia cualquier cosa menos comillas simples alrededor de los valores de atributos)
  4. Envía el HTML a un servicio web que crea el PDF.

En algún lugar de ese lío, los espacios que no se rompen de la plantilla HTML (los   s) se codifican como ISO-8859-1 para que se muestren incorrectamente como un carácter "Â" al ver el documento en un navegador (FireFox). ActivePDF vomita en estos caracteres no UTF8.

Mi pregunta: ya que no sabe de dónde proviene el problema y no tiene tiempo para investigarlo, ¿hay una manera fácil de recodificar o encontrar y reemplazar los personajes malos? He intentado enviarlo a través de esta pequeña función que junté, pero lo convierte todo en gobbledegook no cambia nada.

Private Shared Function ConvertToUTF8(ByVal html As String) As String
    Dim isoEncoding As Encoding = Encoding.GetEncoding("iso-8859-1")
    Dim source As Byte() = isoEncoding.GetBytes(html)
    Return Encoding.UTF8.GetString(Encoding.Convert(isoEncoding, Encoding.UTF8, source))
End Function

¿Alguna idea?

EDITAR:

Me estoy arreglando con esto por ahora, aunque no parece una buena solución:

Private Shared Function ReplaceNonASCIIChars(ByVal html As String) As String
    Return Regex.Replace(html, "[^\u0000-\u007F]", " ")
End Function
Author: Cᴏʀʏ, 2009-09-22

7 answers

En algún lugar de ese lío, los espacios que no se rompen de la plantilla HTML (las s) se codifican como ISO-8859-1 de modo que se muestran incorrectamente como un carácter "Â"

Eso sería codificar a UTF-8 entonces, no ISO-8859-1. El carácter de espacio sin ruptura es byte 0xA0 en ISO-8859-1; cuando se codifica en UTF-8 sería 0xC2,0xA0, que, si lo ve (incorrectamente) como ISO-8859-1, aparece como " ". Eso incluye un nbsp final que puede que no te estés dando cuenta; si ese byte no es allí, entonces algo más ha dañado su documento y tenemos que ver más arriba para averiguar qué.

¿Qué es la expresión regular, cómo funciona la plantilla? Parecería que hay un analizador HTML apropiado involucrado en alguna parte si sus cadenas   están siendo (correctamente) convertidas en caracteres de ESPACIO U+00A0 QUE NO ROMPEN. Si es así, puede procesar su plantilla de forma nativa en el DOM y pedirle que se serialice utilizando la codificación ASCII para mantener los caracteres no ASCII como referencias de caracteres. Que también dejar de tener que hacer regex post-procesamiento en el propio HTML, que siempre es un negocio muy dudoso.

Bueno, de todos modos, por ahora puede agregar uno de los siguientes a su documento <head> y ver si eso lo hace ver bien en el navegador:

  • para HTML4: <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
  • para HTML5: <meta charset="utf-8">

Si ha hecho eso, entonces cualquier problema restante es culpa de ActivePDF.

 311
Author: bobince,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-10 00:21:48

Si alguien tenía el mismo problema que yo y el conjunto de caracteres ya era correcto, simplemente haga esto:

  1. Copie todo el código dentro del .archivo html.
  2. Abra el bloc de notas (o cualquier editor de texto básico) y pegue el código.
  3. Ir"Archivo -> Guardar como"
  4. Introduzca su nombre de archivo "ejemplo.html " (Seleccionar "Guardar como tipo: Todos los archivos (.)")
  5. Seleccione la codificación como UTF-8
  6. Pulse Guardar y ahora puede eliminar su antiguo.el archivo html y la codificación deben arreglarse
 22
Author: Noki,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-05 13:51:00

Problema: Incluso yo estaba enfrentando el problema donde estábamos enviando '£' con alguna cadena en POST request al sistema CRM, pero cuando estábamos haciendo la llamada GET desde CRM, estaba regresando '£' con algún contenido de cadena. Así que lo que hemos analizado es que '£' fue llegar convertidos a '£'.

Análisis: La falla que hemos encontrado después de hacer la investigación es que en POST call hemos establecido HttpWebRequest ContentType como "text / xml" mientras que en GET Call era "text/xml; charset:utf-8".

Solución: Así que como parte de la solución hemos incluido el charset:utf-8 en POST request y funciona.

 7
Author: Himanshu Tarsoliya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-24 05:03:50

En mi caso estaba recibiendo signo de cruz latina en lugar de nbsp, incluso que una página estaba correctamente codificada en el UTF-8. Nada de lo anterior ayudó a resolver el problema y lo intenté todo.

Al final, el cambio de fuente para IE (con CSS específico del navegador) ayudó, estaba usando Helvetica-Nue como fuente de cuerpo cambiando a la Arial resolvió el problema .

 -1
Author: Mohika,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-04 12:00:59

Bueno, también tengo este problema en mis pocos sitios web y todo lo que necesito hacer es personalizar el fetler de contenido para entidades HTML. antes de que más los elimino más tengo, así que simplemente cambia html fiter o función de análisis para la página y funcionó. Se debe principalmente a los editores HTML en la mayoría de los CMSs. la forma en que almacenan analizar los datos causó este problema (En mi caso). Que esto ayudaría en su caso también

 -1
Author: JK-Ryder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-25 04:01:26

Estaba teniendo el mismo tipo de problema. Aparentemente es simplemente porque PHP no reconoce utf-8.

Me estaba arrancando el pelo al principio cuando un signo '£' seguía apareciendo como '£', a pesar de que parecía estar bien en DreamWeaver. Finalmente recordé que había estado teniendo problemas con los enlaces relativos al archivo de índice, cuando las páginas, si se veían directamente, funcionarían con presentaciones de diapositivas, pero no cuando se usaban con un include (pero eso no viene al caso. De todos modos me preguntaba si esto podría ser un similar problema, así que en lugar de poner en la página con la que estaba teniendo problemas, simplemente lo puse en el índice.archivo php - problema solucionado en todas partes.

 -2
Author: FourPart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-16 20:17:33

La razón de esto es que PHP no reconoce utf-8.

Aquí puede verificar todos los caracteres especiales en HTML

Http://www.degraeve.com/reference/specialcharacters.php

 -3
Author: al123,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-05 13:50:50