2011-09-10 28 views
7

Para que el sitio web acepte contenido enviado por el usuario que puede no estar en inglés (por ejemplo, japonés) y guardarlo en la base de datos, ¿le conviene utf8_encode? todo el contenido nuevo, y el usuario utf8_decode al recuperarlo más tarde?Internacionalizar las mejores prácticas de contenido para usar utf8_encode() (función php)

Más información: estoy usando doctrina y estoy recibiendo un error al intentar guardar o seleccionar los caracteres Unicode a la base de datos MySQL:

SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='

+0

Por favor, incluya su esquema de tabla en esto. ¿Y es posible proporcionar el sql completo? <- Sugerencia (problema de comparación) – ajreal

+0

Necesita más información: ¿Qué colación (s) usan sus tablas? –

+0

posible duplicado de [UTF-8 hasta el final] (http://stackoverflow.com/questions/279170/utf-8-all-the-way-through) – mercator

Respuesta

8

No es necesario utilizar la función de codificación. Lo que debe hacer es asegurarse de que sea UTF8 de extremo a extremo. Parece que su base de datos podría estar usando codificación y compilación latin1. Su conexión a la base de datos también debe ser UTF8. A veces, simplemente es cuestión de ejecutar la consulta SET NAMES UTF8 justo después de establecer una conexión.

Ejecutar este comando en mysql probablemente resolverá el error que se ve arriba, pero aún necesita ser UTF8 de extremo a extremo. Entonces no necesitas hacer nada especial con tus datos.

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; 
5

Brent es correcto. Necesita ser de extremo a extremo. Aquí está mi lista:

Apache config: 
    AddDefaultCharset UTF-8 
    AddCharset UTF-8 .utf8 

php.ini: 
    default_charset = "utf-8" 

MySQL: 
    ALTER DATABASE DEFAULT CHARACTER SET utf8; 
    ALTER TABLE SomeTableName DEFAULT CHARACTER SET utf8; 

PHP/HTML: 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
    … 
    <form … <input type="text" name="some_field" value="<?php echo htmlspecialchars($row['some_field'], ENT_COMPAT, 'UTF-8'); ?>"… 

This last one seems the most important. Call this function immediately after the mysql_connect() call: 
    mysql_query("SET NAMES 'utf8'"); 
Cuestiones relacionadas