2009-09-22 40 views
171

Tengo una aplicación heredada que empieza a portarse mal, por alguna razón no estoy seguro. Genera un montón de HTML que se convierte en informes PDF por ActivePDF.Problemas de codificación HTML - aparece el carácter "Â" en lugar de " "

El proceso es el siguiente:

  1. Tire una plantilla HTML a partir de una base de datos con fichas en ella para ser reemplazado (por ejemplo, "~ ~ NombreCompañía", "~ ~ CustomerName", etc.)
  2. Vuelva a colocar las fichas con datos reales
  3. ordenado el HTML con una simple función de expresiones regulares esa etiqueta formatos de propiedad HTML valores de atributos (asegura comillas, etc, ya motor de renderizado de ActivePDF odia cualquier cosa menos comillas simples alrededor de valores de atributos)
  4. enviamos de las HTML a un servicio web que crea el PDF.

En algún lugar de ese desastre, los espacios de no separación de la plantilla HTML (los   s) se codifica como ISO-8859-1 para que muestren de manera incorrecta como un carácter "A" cuando se visualiza el documento en un navegador (FireFox). ActivePDF vomita estos caracteres que no son UTF8.

Mi pregunta: dado que no sé de dónde viene el problema y no tengo tiempo para investigarlo, ¿hay alguna manera fácil de volver a codificar o encontrar y reemplazar los caracteres incorrectos? He intentado enviarlo a través de esta pequeña función que lancé junto, 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?

EDIT:

que estoy recibiendo por con esto por ahora, a pesar de que casi no parece ser una buena solución:

Private Shared Function ReplaceNonASCIIChars(ByVal html As String) As String 
    Return Regex.Replace(html, "[^\u0000-\u007F]", " ") 
End Function 
+2

¿El HTML contiene alguna metainformación para describir su juego de caracteres? –

+1

[Comentarios anteriores eliminados] Respuesta corta: no. –

+0

Para mí funcionó: utf8_decode() – ursuleacv

Respuesta

289

En algún lugar de ese desastre, los espacios de no separación desde la plantilla HTML (  s) están codificando como ISO-8859-1 para que aparezcan incorrectamente como un carácter "Â"

Eso estaría codificando para UTF-8 entonces, no ISO-8859-1. El carácter de espacio sin interrupción es byte 0xA0 en ISO-8859-1; cuando está codificado en UTF-8 sería 0xC2, 0xA0, que, si (incorrectamente) lo ve como ISO-8859-1 sale como " ". Eso incluye un nbsp final que puede no estar notando; si ese byte no está allí, entonces algo más ha perjudicado su documento y necesitamos ver más arriba para descubrir qué.

¿Cuál es la expresión regular? ¿Cómo funciona la creación de plantillas? Parecería que hay un analizador HTML apropiado involucrado en alguna parte si sus cadenas   se están (correctamente) convirtiendo en caracteres U + 00A0 ESPACIO NO ROMPIENDO. De ser así, podría simplemente procesar su plantilla de forma nativa en el DOM, y pedirle que serialice utilizando la codificación ASCII para mantener caracteres no ASCII como referencias de caracteres. Eso también evitaría que tuviera que hacer el procesamiento posterior de expresiones regulares en el propio HTML, que siempre es un negocio altamente peligroso.

Bueno de todos modos, por ahora se puede añadir uno de los siguientes a su documento de <head> y ver si eso hace que se vea directamente en el navegador:

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

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

+40

'' en HTML5 –

+15

No recomendaría '' todavía. La versión 'http-equiv' sigue siendo válida en HTML5 y está mejor respaldada. – bobince

+7

Respuestas de [Cuál usar: vs

19

Si alguien tenía el mismo problema que yo y el juego de caracteres ya era correcta, sólo tiene que hacer esto:

  1. copiar 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. Go "Archivo -> Guardar como"
  4. Introduzca usted presenta el nombre "example.html" (selecciona "Guardar como tipo: Todos los archivos ().")
  5. Seleccionar codificación UTF-8
  6. Hit Guardar y ahora se puede eliminar el archivo .html de edad y la codificación debe fijarse
+1

Esto lo hizo por mí. Ahora en sublime dice 'UTF-8 con BOM' en lugar de' UTF-8'. Para ver esto en texto sublime, necesita 'show_encoding' establecido en' true' en Configuraciones - Usuario. – Ciwan

+0

Tuve el problema de mostrar  en lugar de », amd Al usar esta solución, se solucionó el problema, pero hay una advertencia php:' Advertencia: session_start(): No se puede enviar el limitador de caché de sesión - cabeceras ya enviadas (salida iniciada en D: \ Archivos de programa \ wamp \ wamp \ www \ projects \ kerala \ kerala_public_html \ edit \ business_details.php: 1) en D: \ Archivos de programa \ wamp \ wamp \ www \ projects \ kerala \ kerala_public_html \ user \ include \ fg_membersite.php on línea 152' – SCC

+0

funcionó para mí. genial: D –

-1

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

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

-2

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

Me estaba arrancando los pelos al principio cuando un signo '£' seguía apareciendo como 'Â £', a pesar de que estaba bien en DreamWeaver. Eventualmente, recordé que había tenido 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 utilizaba con una función de inclusión (pero eso está al margen. De todos modos, me preguntaba si esto podría ser problema similar, así que en lugar de ponerlo en la página con la que estaba teniendo problemas, simplemente lo puse en el archivo index.php - problema solucionado.

-3

El motivo de esto es que PHP no reconoce utf-8.

Aquí se puede comprobar que todos los caracteres especiales en HTML

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

+1

Esto no era una pregunta sobre PHP, es VB.NET. –

+0

i no, pero puede usar estos caracteres para resolver el problema. esto solucionó mi solución. – al123

6

Problema: Incluso me enfrentaba el problema en el que estábamos enviando '£' con un trozo de cuerda en la solicitud POST al Sistema de CRM, pero cuando estábamos haciendo la llamada GET de CRM, que regresaba 'Â £ ' con un poco de contenido de cadena. Entonces, lo que hemos analizado es que '£' se estaba convirtiendo a 'Â £'.

Análisis: El problema técnico que hemos encontrado después de hacer la investigación es que en la llamada de la POST hemos establecido HttpWebRequest ContentType como "text/xml" mientras que en GET Llame era "text/xml; charset: utf-8 ".

Solución: Así como la parte de la solución que han incluido el juego de caracteres : UTF-8 en la solicitud POST y funciona.

-1

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

Cuestiones relacionadas