Knowledge base

1000 FAQs, 500 tutorials and instructional 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 utf8 instead of utf8mb4
    • MySQL table or column in latin1 or utf8 instead of utf8mb4
    • 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
  • 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
  • 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_ci or utf8mb4_general_ci.
  • In the Operations tab, choose 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 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-8

 

6. 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.sql

In phpMyAdmin, specify the import encoding (e.g., UTF-8, UTF-8MB4 or latin1 depending on the file).


Has this FAQ been helpful?