1000 FAQs, 500 tutorials and explanatory videos. Here, there are only solutions!
Resolve a page encoding issue
This guide is intended for developers and webmasters experiencing issues with the display of special characters (e.g., accents, Arabic characters, Chinese characters, emojis, etc.), whether on an Infomaniak website or in its database.
Preamble
- Common causes of incorrectly displayed characters that appear in place of special characters or emojis like
??:- PHP connection in
utf8instead ofutf8mb4 - MySQL table or column in
latin1orutf8instead ofutf8mb4 - SQL file encoded differently from the import parameter
- HTML/CSS/JS files incorrectly encoded
- Missing or incorrect declaration of the charset in HTML, PHP, or HTTP
- PHP connection in
- Common solutions:
- Use
utf8mb4everywhere: database, connections, tables, columns, files, headers - Validate the encoding of all files and dumps
- Test the display of emojis, accents, and other multilingual characters
- Use
- Also refer to this other guide to force another encoding when connecting to a MySQL database.
Use a text editor that supports saving in UTF-8 without BOM (Visual Studio Code, Sublime Text, Notepad++...)
1. Use UTF-8 or UTF-8MB4 everywhere
The utf8 encoding of MySQL does not support 4-byte characters, such as emojis. These will display as ??. Therefore, you need to use utf8mb4, which is a complete implementation of UTF-8.
2. HTML β Correct declaration of encoding
In the <head> of your HTML pages:
<meta charset="UTF-8">Also ensure that CSS/JS files are saved in UTF-8 (without BOM).
3. PHP β Force UTF-8 or UTF-8MB4
a) HTTP headers
header('Content-Type: text/html; charset=utf-8');b) MySQL connection (MySQL API)
$connection = mysql_connect($host, $user, $pass);
mysql_set_charset('utf8mb4', $connection);c) PDO connection
$dsn = "mysql:host=localhost;dbname=ma_base;charset=utf8mb4";
$pdo = new PDO($dsn, $user, $pass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);4. MySQL database
a) Configuration in phpMyAdmin
- Database, tables, and columns must be in
utf8mb4_unicode_ciorutf8mb4_general_ci. - In the Operations tab, choose
utf8mb4_unicode_cifor the collation.
b) Useful SQL commands
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) After PHP connection
mysqli_query($conn, "SET NAMES 'utf8mb4'");
mysqli_query($conn, "SET CHARACTER SET 'utf8mb4'");5. .user.ini / .htaccess
To force server-side (Apache) encoding:
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-86. SQL dump import / export
Errors such as Γ© becoming ? or an emoji βΊ becoming ?? often come from encoding misalignment.
Check the SQL file encoding before import. Use iconv if necessary:
iconv -f ISO-8859-1 -t UTF-8 dump.sql > dump_utf8.sqlIn phpMyAdmin, specify the import encoding (e.g., UTF-8, UTF-8MB4 or latin1 depending on the file).