with una texto sustituir separar remove palabra limpiar from eliminar cadenas cadena allow all php mysql internationalization

una - separar cadena php



Mejores prácticas en PHP y MySQL con cadenas internacionales (6)

En el primer vistazo a http://www.nicknettleton.com/zine/php/php-utf-8-cheatsheet , creo que falta algo importante (tal vez no lo haya visto). Dependiendo de su instalación y / o configuración MySQL, debe configurar la codificación de conexión para que MySQL sepa qué codificación espera del lado del cliente (es decir, del lado del cliente de la conexión MySQL, que debería ser su script PHP). Puede hacer esto 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 mediante el uso de

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

al inicializar su conexión db.

A menudo sucede que caracteres como é se transforman en à © , incluso aunque la intercalación para el DB, la tabla y el campo de MySQL esté establecida en utf8_general_ci. La codificación en el tipo de contenido para la página también se establece en UTF8.

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

He leído el artículo " El desarrollador absoluto de software absolutamente absoluto, positivamente debe saber sobre Unicode y juegos de caracteres (¡No hay excusas!) ", Pero necesito algunos indicadores 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?


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 las siguientes banderas Mysql estén configuradas correctamente:

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

Esos se pueden establecer en el archivo de configuración de mysql (en la pestaña [mysqld]) o en tiempo de ejecución mediante el envío de las consultas adecuadas.


Colación y juego de caracteres no son lo mismo. Su intercalación debe coincidir con el juego de caracteres, por lo que si su juego de caracteres es utf-8, también debe coincidir con el juego de caracteres. Sin embargo, elegir la colación incorrecta no distorsionará sus datos: simplemente haga que la comparación / ordenación de cadenas funcione incorrectamente.

Dicho esto, hay varios lugares en los que puede establecer configuraciones de juego de caracteres en PHP. Le recomendaría que use utf-8 en todo momento, si es posible. Los lugares que necesitan el juego de caracteres especificado son:

  • La base de datos. Esto se puede establecer en base de datos, tabla y nivel de campo, e incluso en un nivel por consulta.
  • Conexión entre PHP y 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 la función de header de PHP.
  • Entrada HTTP En general, los formularios se incluirán en el mismo juego de caracteres que se sirvió en la página, pero para asegurarse, debe especificar la propiedad accept-charset . También asegúrese de que las URL estén codificadas en utf-8, o evite el uso de caracteres que no sean ASCII en los parámetros de URL (y GET).

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

Hay al menos dos problemas en cuanto a utf-8 y PHP. El primero es que las funciones de cadenas integradas 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 una buena reducción de las limitaciones en esta página . Por lo general, no es un gran problema, pero especialmente cuando se usan librerías tripartitas, debes ser consciente de que las cosas podrían explotar. 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 que tengan en cuenta utf-8. Todavía no es una solución 100% a prueba de balas, pero funcionará para la mayoría de los casos.

Otro problema es que algunas instalaciones de PHP todavía tienen magic_quotes configuración magic_quotes . Este problema es ortogonal a utf-8, pero puede provocar algunos arañazos en la cabeza. Apágalo, por tu propia cordura.


Independientemente del idioma en el que esté escrito, si creara una aplicación que permita una amplia gama de codificaciones, trátelas en pedazos:

  • Identificar la codificación
    • de alguna manera, quiere saber qué tipo de codificación está tratando, de lo contrario, no tiene sentido considerarlo más. Terminarás con chatarra.
  • Maneja tus bytes
    • pensar 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 identificarlo como tal
  • Tienda para el LCD
    • Nuevamente, no quiere truncar datos. Si está almacenando una oración en inglés, ¿también puede almacenar un conjunto de glifos mandarín? ¿Qué hay del árabe? ¿Cuál de estos requerirá más espacio? Cuenta para ello.


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() 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 utilizando las mb_string o utf8_encode/decode cuando hace esto.