1000 FAQ, 500 tutorial e video esplicativi. Qui ci sono delle soluzioni!
Risolvere un problema di codifica delle pagine
Questa guida è destinata agli sviluppatori e ai webmaster che riscontrano problemi di visualizzazione dei caratteri speciali (ad esempio accenti, caratteri arabi, cinesi, emoji, ecc.), sia su un sito web Infomaniak che nel suo database.
Premessa
- Cause frequenti dei caratteri mal visualizzati che appaiono al posto di caratteri speciali o emoji come
??
:- Connessione PHP in
utf8
invece diutf8mb4
- Tabella o colonna MySQL in
latin1
outf8
invece diutf8mb4
- File SQL codificato diversamente dal parametro di importazione
- File HTML/CSS/JS codificati male
- Assenza o dichiarazione errata del charset lato HTML, PHP o HTTP
- Connessione PHP in
- Soluzioni abituali:
- Utilizzare
utf8mb4
ovunque: base, connessioni, tabelle, colonne, file, intestazioni - Validare l'encodaggio di tutti i file e i dump
- Testare la visualizzazione degli emoji, degli accenti e di altri caratteri multilingue
- Utilizzare
- Prendi anche visione di questa altra guida per forzare un altro codice di codifica durante la connessione a un database MySQL.
Utilizza un editor di testo che supporta il salvataggio in UTF-8 senza BOM (Visual Studio Code, Sublime Text, Notepad++...)
1. Utilizzare UTF-8 o UTF-8MB4 ovunque
L'encodage utf8
di MySQL non supporta i caratteri su 4 ottetti, come gli emoji. Questi appariranno come ??
. È quindi necessario utilizzare utf8mb4
, che è una vera implementazione completa di UTF-8.
2. HTML - Dichiarazione corretta dell'encodaggio
Nell'elemento <head>
delle tue pagine HTML:
<meta charset="UTF-8">
Assicurati anche che i file CSS/JS siano salvati in UTF-8 (senza BOM).
3. PHP – Forzare UTF-8 o UTF-8MB4
a) Intestazioni HTTP
header('Content-Type: text/html; charset=utf-8');
b) Connessione MySQL (API MySQL)
$connection = mysql_connect($host, $user, $pass);
mysql_set_charset('utf8mb4', $connection);
c) Connessione PDO
$dsn = "mysql:host=localhost;dbname=ma_base;charset=utf8mb4";
$pdo = new PDO($dsn, $user, $pass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);
4. Database MySQL
a) Configurazione in phpMyAdmin
- Il database, le tabelle e le colonne devono essere in
utf8mb4_unicode_ci
outf8mb4_general_ci
. - Nella scheda Operazioni, scegli
utf8mb4_unicode_ci
per la collazione.
b) Comandi SQL utili
ALTER DATABASE ma_base CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE ma_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
c) Dopo la connessione PHP
mysqli_query($conn, "SET NAMES 'utf8mb4'");
mysqli_query($conn, "SET CHARACTER SET 'utf8mb4'");
5. File .user.ini / .htaccess
Per forzare la codifica lato server (Apache):
AddDefaultCharset utf-8
Header set Content-Type "text/html; charset=utf-8"
# Pour PHP
php_value default_charset UTF-8
php_value mbstring.internal_encoding UTF-8
6. Importazione/Esportazione di dump SQL
Gli errori come é
che diventa ?
o un emoji ☺ che diventa ??
provengono spesso da un disallineamento dell'encodaggio.
Verifica l'encodaggio del file SQL prima dell'importazione. Utilizza iconv
se necessario:
iconv -f ISO-8859-1 -t UTF-8 dump.sql > dump_utf8.sql
In phpMyAdmin, specificare l'encodaggio di importazione (ad esempio UTF-8
, UTF-8MB4
o latin1
a seconda del file).