Base di conoscenze

1 000 FAQ, 500 tutorial e video esplicativi. Qui ci sono delle soluzioni!

Risolvere un problema di codifica delle pagine

Questa guida è rivolta agli sviluppatori e ai webmaster che riscontrano problemi di visualizzazione di 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 non visualizzati correttamente che appaiono al posto di caratteri speciali o emoji come ??:
    • Connessione PHP in utf8 invece di utf8mb4
    • Tabella o colonna MySQL in latin1 o utf8 invece di utf8mb4
    • File SQL codificato diversamente dal parametro di importazione
    • File HTML/CSS/JS codificati in modo errato
    • Assenza o dichiarazione errata del charset lato HTML, PHP o HTTP
  • Soluzioni abituali:
    • Utilizzare utf8mb4 ovunque: base, connessioni, tabelle, colonne, file, intestazioni
    • Validare la codifica di tutti i file e i dump
    • Testare la visualizzazione degli emoji, degli accenti e di altri caratteri multilingue
  • Prendere anche visione di questa altra guida per forzare un'altra codifica durante la connessione a un database MySQL.

 

Utilizzare 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

La codifica utf8 di MySQL non supporta i caratteri su 4 byte, come gli emoji. Questi ultimi appariranno come ??. È quindi necessario utilizzare utf8mb4, che è una vera e propria implementazione completa di UTF-8.

 

2. HTML – Dichiarazione corretta della codifica

Nel <head> delle vostre pagine HTML:

<meta charset="UTF-8">

Assicurarsi 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 o utf8mb4_general_ci.
  • Nella scheda Operazioni, scegliere 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

Errori come é che diventa ? o un emoji ☺ che diventa ?? derivano spesso da un disallineamento di codifica.

Verifica la codifica del file SQL prima dell'importazione. Usa iconv se necessario:

iconv -f ISO-8859-1 -t UTF-8 dump.sql > dump_utf8.sql

In phpMyAdmin, specificare la codifica di importazione (ad esempio UTF-8, UTF-8MB4 o latin1 a seconda del file).


Questa FAQ è stata utile?