Buscar..


Observaciones

  • Debe asegurarse de que cada vez que procese una cadena UTF-8, lo haga de manera segura. Esta es, desafortunadamente, la parte difícil. Probablemente querrá hacer un uso extensivo de la extensión mbstring de PHP.

  • Las operaciones de cadena incorporadas de PHP no son seguras por defecto para UTF-8. Hay algunas cosas que puede hacer de manera segura con las operaciones normales de cadena de PHP (como la concatenación), pero para la mayoría de las cosas debería usar la función equivalente mbstring .

Entrada

  • Debe verificar que todas las cadenas recibidas sean UTF-8 válidas antes de intentar almacenarlas o usarlas en cualquier lugar. PHP mb_check_encoding() hace el truco, pero tienes que usarlo consistentemente. Realmente no hay forma de evitar esto, ya que los clientes malintencionados pueden enviar datos en cualquier codificación que deseen.

    $string = $_REQUEST['user_comment'];
    if (!mb_check_encoding($string, 'UTF-8')) {
        // the string is not UTF-8, so re-encode it.
        $actualEncoding = mb_detect_encoding($string);
        $string = mb_convert_encoding($string, 'UTF-8', $actualEncoding);
    }
    
  • Si está utilizando HTML5, puede ignorar este último punto. Desea que todos los datos que le envíen los navegadores estén en UTF-8. La única forma confiable de hacer esto es agregar el atributo accept-charset a todas sus etiquetas <form> así:

    <form action="somepage.php" accept-charset="UTF-8">
    

Salida

  • Si su aplicación transmite texto a otros sistemas, también deberán estar informados de la codificación de caracteres. En PHP, puede usar la opción default_charset en php.ini , o emitir manualmente el encabezado MIME Content-Type . Este es el método preferido para apuntar a los navegadores modernos.

    header('Content-Type: text/html; charset=utf-8');
    
  • Si no puede establecer los encabezados de respuesta, también puede configurar la codificación en un documento HTML con metadatos HTML .

    • HTML5

      <meta charset="utf-8">
      
    • Versiones anteriores de HTML

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

Almacenamiento de datos y acceso

Este tema trata específicamente sobre UTF-8 y las consideraciones para usarlo con una base de datos. Si desea obtener más información sobre el uso de bases de datos en PHP, consulte este tema .

Almacenamiento de datos en una base de datos MySQL:

  • Especifique el utf8mb4 caracteres utf8mb4 en todas las tablas y columnas de texto en su base de datos. Esto hace que MySQL almacene y recupere físicamente los valores codificados de forma nativa en UTF-8.

    MySQL usará implícitamente la codificación utf8mb4 si se especifica una intercalación utf8mb4_* (sin ningún conjunto de caracteres explícito).

  • Las versiones anteriores de MySQL (<5.5.3) no admiten utf8mb4 por lo que se verá obligado a usar utf8 , que solo admite un subconjunto de caracteres Unicode.

Accediendo a los datos en una base de datos MySQL:

  • En su código de aplicación (por ejemplo, PHP), en cualquier método de acceso a base de datos que use, deberá configurar el conjunto de caracteres de conexión en utf8mb4 . De esta manera, MySQL no realiza ninguna conversión desde su UTF-8 nativo cuando entrega los datos a su aplicación y viceversa.

  • Algunos controladores proporcionan su propio mecanismo para configurar el conjunto de caracteres de conexión, que actualiza su propio estado interno e informa a MySQL de la codificación que se utilizará en la conexión. Este suele ser el enfoque preferido.

    Por ejemplo (la misma consideración con respecto a utf8mb4 / utf8 aplica como anteriormente):

    • Si está utilizando la capa de abstracción PDO con PHP ≥ 5.3.6, puede especificar el charset de charset en el DSN :

      $handle = new PDO('mysql:charset=utf8mb4');
      
    • Si está usando mysqli , puede llamar a set_charset() :

      $conn = mysqli_connect('localhost', 'my_user', 'my_password', 'my_db');
      
      $conn->set_charset('utf8mb4');        // object oriented style
      mysqli_set_charset($conn, 'utf8mb4'); // procedural style
      
    • Si está atascado con MySQL simple pero está ejecutando PHP ≥ 5.2.3, puede llamar a mysql_set_charset .

      $conn = mysql_connect('localhost', 'my_user', 'my_password');
      
      $conn->set_charset('utf8mb4');       // object oriented style
      mysql_set_charset($conn, 'utf8mb4'); // procedural style
      
    • Si el controlador de la base de datos no proporciona su propio mecanismo para configurar el conjunto de caracteres de conexión, es posible que tenga que realizar una consulta para decirle a MySQL cómo su aplicación espera que los datos de la conexión se codifiquen: SET NAMES 'utf8mb4' .



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow