1000 FAQs, 500 tutorials and explanatory videos. Here, there are only solutions!
Solve a page encoding problem
This guide is for developers and webmasters experiencing issues displaying special characters (such as 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 instead of special characters or emojis like
??
:- PHP connection in
utf8
instead ofutf8mb4
- MySQL table or column in
latin1
orutf8
instead ofutf8mb4
- SQL file encoded differently from the import parameter
- HTML/CSS/JS files improperly encoded
- Missing or incorrect charset declaration on the HTML, PHP, or HTTP side
- PHP connection in
- Common solutions:
- Use
utf8mb4
everywhere: 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 characters on 4 bytes, like emojis. These will display as ??
. Therefore, you should use utf8mb4
, which is a true complete implementation of UTF-8.
2. HTML β Correct encoding declaration
In the <head>
of your HTML pages:
<meta charset="UTF-8">
Make sure that CSS/JS files are also 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
- Databases, tables, and columns should be in
utf8mb4_unicode_ci
orutf8mb4_general_ci
. - In the Operations tab, select
utf8mb4_unicode_ci
for 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 the PHP connection
mysqli_query($conn, "SET NAMES 'utf8mb4'");
mysqli_query($conn, "SET CHARACTER SET 'utf8mb4'");
5. .user.ini / .htaccess file
To force encoding on the server side (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. Import / export of SQL dumps
Errors such as Γ©
becoming ?
or an emoji βΊ becoming ??
often stem from encoding misalignment.
Check the encoding of the SQL file before import. Use iconv
if necessary:
iconv -f ISO-8859-1 -t UTF-8 dump.sql > dump_utf8.sql
In phpMyAdmin, specify the import encoding (for example UTF-8
, UTF-8MB4
or latin1
depending on the file).