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
enphp.ini
, o emitir manualmente el encabezado MIMEContent-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
caracteresutf8mb4
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ónutf8mb4_*
(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 usarutf8
, 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
decharset
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'
.