Problemas de codificación HTML: aparece el carácter "Â" en lugar de "& nbsp;"


203

Tengo una aplicación heredada que apenas comienza a comportarse mal, por alguna razón no estoy seguro. Genera un montón de HTML que ActivePDF convierte en informes PDF.

El proceso funciona así:

  1. Extraiga 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. Ordene el HTML con una función de expresión regular simple que formatea los valores de los atributos de la etiqueta HTML (asegura las comillas, etc., ya que el motor de representación de ActivePDF odia todo menos las comillas simples alrededor de los valores de los atributos)
  4. Envíe el HTML a un servicio web que cree el PDF.

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

Mi pregunta: dado que no sé de dónde surge el problema y no tengo tiempo para investigarlo, ¿hay alguna manera fácil de volver a codificar o buscar y reemplazar los caracteres malos? Intenté enviarlo a través de esta pequeña función que reuní , 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

¿Algunas ideas?

EDITAR:

Me estoy yendo bien 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

2
¿El HTML contiene alguna metainformación para describir su conjunto de caracteres?
Rowland Shaw

1
[Anterior comentado eliminado] Respuesta corta: no.
Cᴏʀʏ

1
Para mí trabajó: utf8_decode ()
ursuleacv

Respuestas:


340

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

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

¿Cuál es la expresión regular, cómo funciona la plantilla? Parecería que hay un analizador HTML adecuado involucrado en algún lugar si sus  cadenas (correctamente) se convierten en caracteres U + 00A0 NON-BREAKING SPACE. 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. Eso también evitaría que tenga que realizar un procesamiento posterior de expresiones regulares 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.


20
No lo recomendaría <meta charset="utf-8">aún. La http-equivversión sigue siendo válida en HTML5 y está mejor soportada.
bobince

8
Respuestas de cuál usar: <meta charset = 'utf-8'> vs <meta http-equiv = 'Content-Type' indica que la versión corta está bien soportada.
Richard Ayotte


Funciona en todos los navegadores modernos . Ciertamente no funciona en todos los navegadores heredados y de nicho (por ejemplo, móviles), ni en todas las arañas.
bobince

3
"En algún lugar en ese lío" ... LOL! Bonito abierto! ¡Buena respuesta! +1
Diseño de resistencia

24

Si alguien tuvo el mismo problema que yo y el juego 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. Vaya "Archivo -> Guardar como"
  4. Ingrese su nombre de archivo "example.html" (Seleccione "Guardar como tipo: Todos los archivos ( . )")
  5. Seleccione Codificación como UTF-8
  6. Presiona Guardar y ahora puedes eliminar tu antiguo archivo .html y la codificación debería ser reparada

2
Esto lo hizo por mi. Ahora en sublime dice en UTF-8 with BOMlugar de UTF-8. Para ver esto en texto sublime, debe show_encodingconfigurarlo trueen Configuración - Usuario.
J86

Tuve el problema de mostrar  en lugar de », amd Al usar esta solución, el problema se resolvió pero hay una advertencia de php: Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at D:\Program Files\wamp\wamp\www\projects\kerala\kerala_public_html\edit\business_details.php:1) in D:\Program Files\wamp\wamp\www\projects\kerala\kerala_public_html\user\include\fg_membersite.php on line 152
SCC

Esta solución funcionó para mí. Estaba trabajando en notepad ++, y cuando lo guardé en el bloc de notas ms básico como UTF-8, después de abrir el nuevo archivo en notepad ++, la codificación se configuró en UTF-8-BOM (que no estoy seguro de lo que significa). De todos modos, ese parece haber sido el problema para mí.
BoltKey

¡Gracias! Esto hizo el truco. Veo en la solicitud / respuesta que el archivo (en mi caso, ASPX) fue codificado como UTF-8. Notepad ++ también lo codificó para UTF-8. ¿Qué diablos, verdad? Pero tu solución hizo el truco. Para mí, era una frase en español que no codificaba correctamente en la página. He leído en otro lugar para no usar UTF-8 BOM para español pero me lo arregló.
user3621633

13

Problema: Incluso estaba enfrentando el problema de que estábamos enviando '£' con alguna cadena en la solicitud POST al sistema CRM, pero cuando estábamos haciendo la llamada GET desde CRM, estaba devolviendo 'Â £' con algún contenido de cadena. Entonces, lo que hemos analizado es que '£' se estaba convirtiendo en 'Â £' .

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

Solución: Entonces, como parte de la solución, hemos incluido el juego de caracteres: utf-8 en la solicitud POST y funciona.


0

En mi caso, esto (con cuidado) ocurrió en el código que generé desde Visual Studio usando mi propia herramienta para generar código. Fue fácil de resolver:

Seleccione espacios individuales () en el documento. Debería poder ver muchos espacios individuales que se ven diferentes de los otros espacios individuales, no están seleccionados. Seleccione estos otros espacios individuales: son los responsables de los caracteres no deseados en el navegador. Vaya a Buscar y reemplazar con un solo espacio (). Hecho.

PD: es más fácil ver todos los caracteres similares cuando coloca el cursor en uno o si lo selecciona en VS2017 +; Espero que otros IDEs puedan tener características similares


-1

En mi caso, recibí un signo de cruz latina en lugar de nbsp, incluso si una página estaba codificada correctamente 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 que cambia a Arial resolvió el problema.


La razón por la cual cambiar la fuente puede haber ayudado puede deberse a que una de las fuentes no contenía el carácter en cuestión, por lo que lo que vio fue un carácter vacío. Pero esto no resolvió el problema, solo lo ocultó.
Oliver Hausler

-2

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

Al principio me estaba arrancando el pelo cuando un signo de '£' seguía apareciendo como 'Â £', a pesar de que parecía estar bien en DreamWeaver. Finalmente, recordé que había tenido problemas con los enlaces relacionados con el archivo de índice, cuando las páginas, si se veían directamente, funcionarían con presentaciones de diapositivas, pero no cuando se usaban con una inclusión (pero eso no viene al caso. De todos modos, me preguntaba si esto podría ser un 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; el problema se solucionó por completo.



-2

Bueno, también obtuve este problema en mis pocos sitios web y todo lo que necesito hacer es personalizar el buscador de contenido para las entidades HTML. antes de eso, los elimino más, así que solo cambie su función html fiter o parsing para la página y funcionó. Se debe principalmente a los editores HTML en la mayoría de los CMS. la forma en que almacenan analiza los datos causó este problema (en mi caso). Que esto también ayude en su caso

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.