Este es un problema de juego de caracteres. Como tal, puede haber salido mal en muchos niveles diferentes, pero lo más probable es que las cadenas de su base de datos estén codificadas en utf-8 y las esté presentando como iso-8859-1. O al revés.
La forma correcta de solucionar este problema es aclarar los conjuntos de caracteres. La estrategia más simple, ya que está usando PHP, es usar iso-8859-1 en toda su aplicación. Para hacer esto, debe asegurarse de que:
- Todos los archivos fuente de PHP se guardan como iso-8859-1 (no confundir con cp-1252).
- Su servidor web está configurado para servir archivos con
charset=iso-8859-1
- Alternativamente, puede anular la configuración del servidor web desde dentro del documento PHP, usando
header
.
- Además, puede insertar una metaetiqueta en su HTML, que especifique lo mismo, pero esto no es estrictamente necesario.
- También puede especificar el
accept-charset
atributo en sus <form>
elementos.
- Las tablas de la base de datos se definen con la codificación latin1
- La conexión de la base de datos entre PHP y la base de datos está configurada en latin1
Si ya tiene datos en su base de datos, debe tener en cuenta que probablemente ya estén en mal estado. Si aún no está en la fase de producción, simplemente límpielo todo y comience de nuevo. De lo contrario, tendrá que hacer una limpieza de datos.
Una nota sobre las metaetiquetas, ya que todo el mundo entiende mal lo que son:
Cuando un servidor web sirve un archivo (un documento HTML), envía cierta información, que no se presenta directamente en el navegador. Esto se conoce como encabezados HTTP. Uno de esos encabezados es el Content-Type
encabezado, que especifica el tipo MIME del archivo (por ejemplo text/html
), así como la codificación (también conocido como juego de caracteres). Si bien la mayoría de los servidores web envían un Content-Type
encabezado con charset
información, es opcional. Si no está presente, el navegador interpretará las metaetiquetas con http-equiv="Content-Type"
. Es importante darse cuenta de que la metaetiqueta solo se interpreta si el servidor web no envía el encabezado. En la práctica, esto significa que solo se usa si la página se guarda en el disco y luego se abre desde allí.
Esta página tiene una muy buena explicación de estas cosas.