Pregunta

A menudo sucede que caracteres como é se transforman en à © , a pesar de que la clasificación para la base de datos, la tabla y el campo de MySQL está establecida en utf8_general_ci. La codificación en Content-Type para la página también se establece en UTF8.

Sé sobre utf8_encode / decode, pero no estoy muy seguro de dónde y cómo usarlo.

He leído el " El mínimo absoluto que todo desarrollador de software debe saber absolutamente, positivamente sobre Unicode y Conjuntos de caracteres (¡Sin excusas!) " artículo, pero necesito algunos punteros específicos de MySQL / PHP.

Pregunta: ¿Cómo me aseguro de que los datos ingresados ??por el usuario que contienen caracteres internacionales no se corrompan?

¿Fue útil?

Solución

En el primer vistazo a http://www.nicknettleton.com / zine / php / php-utf-8-cheatsheet Creo que falta algo importante (tal vez pasé por alto esta). Dependiendo de su instalación y / o configuración de MySQL, debe configurar la codificación de la conexión para que MySQL sepa qué codificación espera del lado del cliente (es decir, el lado del cliente de la conexión MySQL, que debería ser su script PHP). Puede hacerlo emitiendo manualmente un

SET NAMES utf8

consulta antes de cualquier otra consulta que envíe al servidor MySQL.

Si está utilizando PDO en el lado de PHP, puede configurar la conexión para emitir automáticamente esta consulta en cada (re) conexión utilizando

$db=new PDO($dsn, $user, $pass);
$db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES utf8");

al inicializar su conexión db.

Otros consejos

La clasificación y el juego de caracteres no son lo mismo. Su intercalación debe coincidir con el conjunto de caracteres, por lo que si su conjunto de caracteres es utf-8, también debería hacerlo. Sin embargo, elegir la clasificación incorrecta no distorsionará sus datos: solo haga que la comparación / clasificación de cadenas funcione incorrectamente.

Dicho esto, hay varios lugares, donde puede establecer la configuración del juego de caracteres en PHP. Recomendaría que use utf-8 en todo momento, si es posible. Los lugares que necesitan un juego de caracteres especificado son:

  • La base de datos. Esto se puede configurar a nivel de base de datos, tabla y campo, e incluso a nivel de consulta.
  • Conexión entre PHP y la base de datos.
  • salida HTTP; Asegúrese de que el encabezado HTTP Content-Type especifique utf-8. Puede establecer valores predeterminados en PHP y en Apache, o puede usar el encabezado función.
  • Entrada HTTP. En general, los formularios se enviarán en el mismo conjunto de caracteres en el que se sirvió la página, pero para asegurarse, debe especificar el propiedad accept-charset . También asegúrese de que las URL estén codificadas con utf-8, o evite el uso de caracteres que no sean ascii en las url (y parámetros GET).

utf8_encode / Las funciones de decodificación tienen un nombre extraño. Convierten específicamente entre latin1 (ISO-8859-1) y utf-8. Si todo en su aplicación es utf-8, no tendrá que usarlos mucho.

Hay al menos dos problemas con respecto a utf-8 y PHP. La primera es que las funciones de cadena incorporadas de PHP esperan que las cadenas sean de un solo byte. Para muchas operaciones, esto no importa, pero significa que no puede confiar en strlen y otras funciones. Hay un buen desglose de las limitaciones en esta página . Por lo general, no es un gran problema, pero especialmente cuando se usan bibliotecas de 3 partes, debe tener en cuenta que las cosas podrían explotar al respecto. Una opción también es usar la extensión mb_string, que tiene la opción de reemplazar todas las funciones problemáticas con alternativas compatibles con utf-8. Todavía no es una solución 100% a prueba de balas, pero funcionará en la mayoría de los casos.

Otro problema es que algunas instalaciones de PHP todavía tienen el magic_quotes configuración activada. Este problema es ortogonal a utf-8, pero puede provocar algunos rasguños en la cabeza. Apáguelo, por el bien de su propia cordura.

No hay mucho que decir que no esté cubierto por este artículo

http://developer.loftdigital.com/blog/php-utf -8-hoja de trucos

Cosas que debes hacer:

  • Asegúrese de que Apache publique contenido UTF-8. Haga esto en su httpd.conf, o use la función header () de PHP para hacerlo manualmente.
  • Asegúrese de que su conexión de base de datos sea UTF8. SET NAMES utf8 hace el truco.
  • Asegúrese de que todas sus tablas estén configuradas en UTF8.
  • Asegúrese de que todos sus archivos PHP y de plantilla estén codificados como UTF8 si almacena caracteres internacionales en ellos.

Por lo general, no tiene que hacer demasiado con las funciones mb_string o utf8_encode / decode cuando hace esto.

Para una mejor corrección unicode, debe usar utf8_unicode_ci (aunque la documentación es un poco vaga sobre las diferencias). También debe asegurarse de que los siguientes indicadores de Mysql estén configurados correctamente:

  • default-character-set = utf8
  • skip-character-set-client-handshake // Importante para que el cliente no aplique otra codificación

Se pueden configurar en el archivo de configuración de mysql (en la pestaña [mysqld]) o en tiempo de ejecución enviando las consultas apropiadas.

Independientemente del idioma en el que esté escrito, si fuera a crear una aplicación que permita una amplia gama de codificaciones, trátela en partes:

  • Identificar la codificación
    • de alguna manera quiere saber qué tipo de codificación está tratando, de lo contrario, es bastante inútil considerarlo más a fondo. Terminarás con caracteres basura.
  • Maneja tus bytes
    • piense en estas cadenas menos como 'cadenas' de caracteres y más como listas de bytes
    • PHP es especialmente astuto. No permita que trunque sus datos sobre la marcha. Si está regexing una cadena UTF-8, asegúrese de identificarla como tal
  • Tienda para la pantalla LCD
    • Nuevamente, no desea truncar datos. Si está almacenando una oración en inglés, ¿también puede almacenar un conjunto de glifos mandarín? ¿Qué tal el árabe? ¿Cuál de estos requerirá más espacio? Cuenta de ello.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top