2010-09-30 11 views
8

Tengo una serie de sitios web que muestran caracteres no válidos. Las metaetiquetas de las páginas especifican la codificación UTF-8. Sin embargo, varias páginas contienen caracteres que no pueden ser interpretados por UTF-8, probablemente porque los archivos se guardaron con otra codificación (como ANSI). El que en particular me preocupa ahora es un apóstrofo elegante (como en "Bob's" ... lo siento si eso no aparece correctamente). El validador de W3 indica que la entidad es "\ x92", pero no validará el archivo porque no se correlaciona con unicode. Y, por supuesto, si abro el archivo en Notepad ++ y cambio la codificación a UTF-8, el personaje es reemplazado por un 92 en una caja negra.¿Cómo arreglo los caracteres HTML no válidos en páginas servidas con codificación diferente?

Aquí está mi pregunta: ¿cuál es la forma más fácil de solucionar esto? ¿Tengo que abrir todas las páginas y reemplazar ese personaje con un apóstrofo convencional? ¿O hay una solución rápida que podría agregar (por ejemplo, a IIS) que podría anular o corregir el problema de codificación? ¿O debo buscar/reemplazar fuerza bruta? Tengo cientos de páginas en estos sitios web y no tengo idea de cuántas de ellas tendría que cambiar, así que si alguien conoce una forma en que podría eludir este problema o solucionarlo rápidamente, lo agradecería.

Respuesta

2

¿Está sirviendo las páginas como HTML directo, o tiene otro sc ¿Qué sirve el contenido? Si tiene una secuencia de comandos que está publicando el contenido, la secuencia de comandos podría buscar cualquier instancia de \ x92 y reemplazarla con un apóstrofo. En PHP esto sería un simple str_replace()

Si está sirviendo HTML directamente, tendrá que modificar los archivos. Sin embargo, esto puede automatizarse (y probablemente debería ser así si tienes cientos de archivos) dependiendo de las herramientas que tienes disponibles y del sistema operativo en el que te encuentres. Como dijiste que estás usando el Bloc de notas ++, supongo que es seguro suponer estás en MS Windows (por lo tanto, no hay comandos Unix divertidos para acelerar las cosas)

Puede ser posible crear un script BATCH que pueda hacer esto, sin embargo. Hay herramientas de edición de texto ASCII muy simples integradas en el Símbolo del sistema. Si eso no es posible, entonces es muy posible hacer un programa C o C++ para hacer esto si tienes un compilador en tu sistema y un conocimiento moderado de C. Si tienes el primero y no el segundo, pregúntame y voy a batir algunos fuente para ti

+0

Sí, este es un entorno de Windows. La mayoría de ellos son HTML estáticos en páginas ASP, desafortunadamente. Veré si eso es una posibilidad. – Andy

1

No estoy seguro acerca de la parte de codificación, pero si terminas teniendo que hacerlo por fuerza bruta, siempre puedes escribir un programa corto que itere por todas tus páginas web, carga cada archivo en memoria, ejecuta una regex.replace para corregir el carácter problemático y guarda el archivo nuevamente en el disco. Obviamente no es ideal, pero es mejor que abrir cada archivo por su cuenta.

buena suerte

+0

Buena idea. Las páginas mismas están actualmente en control de fuente (además de estar en el servidor directo), pero un programa o script que automatiza esta corrección puede ser la solución más fácil. – Andy

0

Todos charcters especiales deben ser codificados en HTML, por ejemplo, un símbolo de copyright debe estar en su HTML como

© 

HTML lista de entidad:

http://www.w3schools.com/HTML/html_entities.asp

En cuanto a cómo se implementa esto depende en gran medida de la forma en que va a crear el código en el primer lugar, pero algo así como ASP.Net tendrá funciones del lado del servidor como:

Server.HTMLEncode("string with special chars") 
+0

Sé que DEBERÍAN serlo, pero no lo son. Necesito arreglar esto para algunos contenidos existentes. – Andy

1

Acabo de toparme con un problema similar donde algunos espacios que no se rompen "xA0" entraron en un documento supuestamente UTF-8. En el bloc de notas ++ se muestran en un recuadro negro con "xA0" escrito en él. Sin embargo notepad ++ no permite que se copien o peguen.

Hice un poco de investigación y descubrí lo que está pasando. Un editor hexadecimal revela que estos están siendo codificados como un solo byte: "A0" que no es válido UTF-8. Cualquier cosa que no sea ASCII debe tener al menos dos bytes, por lo que la codificación adecuada es "C2 A0" en hexadecimal.

Para su ejemplo de apóstrofo elegante, se trata de lo mismo. En realidad, su problema es más complicado porque en caracteres ascii extendidos \ x92 (decimal 146) es un apóstrofo pero en unicode \ x92 es un carácter de control y la cita simple correcta debe ser U + 2019 (decimal 8217). La adición de este símbolo en libreta ++ (a través de Editar-> panel Carácter) y la inspección en un editor hex revela que la codificación hexadecimal adecuada es "E2 80 99", que en binario es 1110 . Cuando elimina los bytes de control UTF-8 (no negrita) esto produce 0010 0000 0000 0001 1001 que es igual a un valor decimal de 8217.

La forma correcta de manejar esto sería abrir su archivo como un flujo de bytes (char sin signo * en c) y busca secuencias impropias de UTF-8. Luego puede reemplazarlos por (vea https://en.wikipedia.org/wiki/UTF-8#Invalid_byte_sequences) o puede tratar de manejarlos de manera personalizada, haciendo reemplazos como A0 -> C2 A0 (espacio sin interrupción codificado incorrectamente) y 92 -> E2 80 99 (cita sola correcta codificada incorrectamente) marca).

Cuestiones relacionadas