2009-09-28 11 views
13

Tengo un formulario HTML y algunos usuarios están copiando/pegando texto de MS Word. Cuando hay comillas simples o dobles, que se traducen en divertidos personajes como:¿Por qué las citas se convierten en divertidos personajes cuando se envían en un formulario HTML?

' €  ™ y à ¢  €  ™

La columna de base de datos es utf8_general_ci colación.

¿Cómo obtengo los caracteres apropiados para mostrar?

Editar: Problema resuelto. Así es como lo arreglé:

Ran mysql_query("SET NAMES 'utf8'"); antes de agregar/recuperar de la base de datos. (gracias al comentario de Donal a continuación).

Y algo extraño, la función php urlencode($text) se aplicó al mostrar, por lo que tuvo que ser eliminada.

También me aseguré de que los encabezados de la página y la solicitud/respuesta de ajax fueran todos utf8.

+4

MS Word cambia las comillas en "citas inteligentes", que son cualquier cosa menos inteligentes. Utilizan una "página de códigos" de Microsoft en lugar de Unicode. –

+0

Notarás esto con algunos guiones también. – Buggabill

+1

Si todas las codificaciones se especifican correctamente, estas deben convertirse automáticamente a su equivalente en Unicode. Dudo que el problema sea específico de Word; intenta escribir, p. Alt + 130 (é) directamente, y ver si se muestra limpiamente. – Thomas

Respuesta

21

Esto parece un caso clásico de Unicode (UTF-8) caracteres más probable es que se interpretan como iso-8859-1. Hay un par de lugares en el camino donde los personajes pueden corromperse. Primero, el navegador del cliente debe enviar los datos. Podría dañar los datos si no puede convertir los caracteres correctamente a la codificación de caracteres de la página. Luego, el servidor lee los datos y decodifica los bytes en caracteres. Si el cliente y el servidor no están de acuerdo con la codificación utilizada, los caracteres estarán dañados. Entonces los datos se almacenan en la base de datos; nuevamente hay potencial para la corrupción. Finalmente, cuando los datos están escritos en la página (para mostrarlos al navegador), el navegador puede malinterpretar los bytes si la página no indica adecuadamente su codificación.

Debe asegurarse de estar utilizando UTF-8 en todo momento. El valor por defecto para las páginas web es iso-8859-1, por lo que sus páginas web se debe servir con la cabecera Content-Type o la etiqueta meta

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 

(asegúrese de que realmente está sirviendo el texto en el que la codificación).

Al usar UTF-8 en todas las partes del proceso, evitará problemas con todos los navegadores web y bases de datos en funcionamiento.

+1

+1, no hay una solución local para estos problemas, lo importante es la mentalidad de ser consciente de la codificación donde sea que esté transmitiendo o almacenando texto. –

+0

Sí, estoy de acuerdo con @ user8599 .... – omega

5

Compruebe la codificación que utiliza la página. Codificarlo con UTF-8, así, y añadir una etiqueta meta descripción de la codificación:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
4

tenemos una función PHP que intenta limpiar el desorden con comillas tipográficas. Es un poco desordenado, ya que ha crecido un poco orgánicamente a medida que aparecían los casos durante el desarrollo del prototipo. Puede ser de alguna ayuda, sin embargo:

function convert_smart_quotes($string) { 
    $search = array(chr(0xe2) . chr(0x80) . chr(0x98), 
        chr(0xe2) . chr(0x80) . chr(0x99), 
        chr(0xe2) . chr(0x80) . chr(0x9c), 
        chr(0xe2) . chr(0x80) . chr(0x9d), 
        chr(0xe2) . chr(0x80) . chr(0x93), 
        chr(0xe2) . chr(0x80) . chr(0x94), 
        chr(226) . chr(128) . chr(153), 
        '’','“','â€<9d>','â€"',' '); 

    $replace = array("'","'",'"','"',' - ',' - ',"'","'",'"','"',' - ',' '); 

    return str_replace($search, $replace, $string); 
} 
+4

Lo he hecho yo mismo, pero creo que es una mala idea. Si tiene un proceso de texto o cualquier otro tipo de proceso que corrompe sus datos, corrija el proceso para que no corrompa los datos, no solo realice correcciones parciales al resultado. –

+0

Sí, media década después. Me encontré con esto ya que estaba manteniendo el código existente. Sabía sobre los problemas de cortar/pegar de programas como Word, pero para hacer una copia de seguridad de @ mike-a, a veces no puedes controlar el origen de la información y debes adoptar un enfoque de normalización para tu flujo de datos. Lo usé y agregué uno más para â € ¢ (viñetas de primer nivel que tuve). –

Cuestiones relacionadas