Ricerca…
Osservazioni
È necessario assicurarsi che ogni volta che si elabora una stringa UTF-8, lo si fa in modo sicuro. Questa è, sfortunatamente, la parte difficile. Probabilmente vorrai fare un uso estensivo dell'estensione
mbstring
di PHP.Le operazioni di stringa incorporate di PHP non sono di default UTF-8 sicuro. Ci sono alcune cose che puoi tranquillamente fare con le normali operazioni di stringa PHP (come la concatenazione), ma per la maggior parte delle cose dovresti usare la funzione equivalente
mbstring
.
Ingresso
È necessario verificare ogni stringa ricevuta come UTF-8 valida prima di provare a memorizzarla o utilizzarla ovunque.
mb_check_encoding()
di PHP fa il trucco, ma devi usarlo in modo coerente. Non c'è davvero alcun modo per aggirare questo problema, poiché i client malevoli possono inviare i dati in qualsiasi codifica che desiderano.$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); }
Se utilizzi HTML5, puoi ignorare quest'ultimo punto. Desideri che tutti i dati inviati dai browser siano in UTF-8. L'unico modo affidabile per farlo è aggiungere l'attributo
accept-charset
a tutti i tag<form>
modo:<form action="somepage.php" accept-charset="UTF-8">
Produzione
Se la tua applicazione trasmette il testo ad altri sistemi, dovranno anche essere informati della codifica dei caratteri. In PHP, è possibile utilizzare l'opzione
default_charset
inphp.ini
o manualmente rilasciare l'intestazione MIMEContent-Type
. Questo è il metodo preferito quando si scelgono i browser moderni.header('Content-Type: text/html; charset=utf-8');
Se non riesci a impostare le intestazioni di risposta, puoi anche impostare la codifica in un documento HTML con metadati HTML .
HTML5
<meta charset="utf-8">
Versioni precedenti di HTML
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Archiviazione e accesso ai dati
Questo argomento parla specificamente di UTF-8 e considerazioni per l'utilizzo con un database. Se desideri maggiori informazioni sull'utilizzo dei database in PHP, controlla questo argomento .
Memorizzazione di dati in un database MySQL:
- Specificare il
utf8mb4
caratteriutf8mb4
su tutte le tabelle e le colonne di testo nel database. In questo modo MySQL memorizza e recupera fisicamente i valori codificati in modo nativo in UTF-8.MySQL utilizzerà implicitamente la codifica
utf8mb4
se viene specificato un confrontoutf8mb4_*
(senza alcun set di caratteri esplicito). - Le versioni precedenti di MySQL (<5.5.3) non supportano
utf8mb4
quindi sarai costretto a usareutf8
, che supporta solo un sottoinsieme di caratteri Unicode.
Accesso ai dati in un database MySQL:
Nel codice dell'applicazione (ad es. PHP), in qualunque metodo di accesso DB si usi, è necessario impostare il set di
utf8mb4
connessione suutf8mb4
. In questo modo, MySQL non esegue alcuna conversione dal suo UTF-8 nativo quando trasferisce i dati alla tua applicazione e viceversa.Alcuni driver forniscono il proprio meccanismo per configurare il set di caratteri di connessione, che aggiorna il proprio stato interno e informa MySQL della codifica da utilizzare sulla connessione. Questo è solitamente l'approccio preferito.
Ad esempio (la stessa considerazione riguardante
utf8mb4
/utf8
applica come sopra):Se stai usando il livello di astrazione PDO con PHP ≥ 5.3.6, puoi specificare il
charset
nel DSN :$handle = new PDO('mysql:charset=utf8mb4');
Se stai usando mysqli , puoi chiamare
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
Se si è bloccati con mysql semplice, ma è possibile eseguire PHP ≥ 5.2.3, è possibile chiamare
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
Se il driver del database non fornisce il proprio meccanismo per impostare il set di caratteri di connessione, potrebbe essere necessario inviare una query per dire a MySQL come l'applicazione si aspetta che i dati sulla connessione siano codificati:
SET NAMES 'utf8mb4'
.