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
mbstringdi 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-charseta 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_charsetinphp.inio 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
utf8mb4caratteriutf8mb4su 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
utf8mb4se viene specificato un confrontoutf8mb4_*(senza alcun set di caratteri esplicito). - Le versioni precedenti di MySQL (<5.5.3) non supportano
utf8mb4quindi 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
utf8mb4connessione 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/utf8applica come sopra):Se stai usando il livello di astrazione PDO con PHP ≥ 5.3.6, puoi specificare il
charsetnel 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 styleSe 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 styleSe 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'.