Kennisbank

1.000 veelgestelde vragen, 500 tutorials en uitlegvideo's. Hier vind je alleen maar oplossingen!

Een probleem met de codering van pagina's oplossen

Deze handleiding is bedoeld voor ontwikkelaars en webmasters die problemen ondervinden met de weergave van speciale tekens (bijvoorbeeld accenten, Arabische tekens, Chinese tekens, emoji's, enz.), zowel op een Infomaniak-website als in de database.

 

Inleiding

  • Veelvoorkomende oorzaken van verkeerd weergegeven tekens die in plaats van speciale tekens of emoji's verschijnen, zoals ??:
    • PHP-verbinding in utf8 in plaats van utf8mb4
    • MySQL-tabel of -kolom in latin1 of utf8 in plaats van utf8mb4
    • SQL-bestand met een andere codering dan de importinstelling
    • HTML/CSS/JS-bestanden met een verkeerde codering
    • Ontbrekende of onjuiste declaratie van de charset aan de HTML-, PHP- of HTTP-zijde
  • Gebruikelijke oplossingen:
    • Gebruik overal utf8mb4: database, verbindingen, tabellen, kolommen, bestanden, headers
    • Controleer de codering van alle bestanden en dumps
    • Test de weergave van emoji's, accenten en andere meertalige tekens
  • Raadpleeg ook deze andere handleiding om een andere codering te forceren bij het verbinden met een MySQL-database.

 

Gebruik een teksteditor die het opslaan in UTF-8 zonder BOM ondersteunt (Visual Studio Code, Sublime Text, Notepad++...).

 

1. Gebruik overal UTF-8 of UTF-8MB4

De utf8-codering van MySQL ondersteunt geen tekens van 4 bytes, zoals emoji's. Deze worden weergegeven als ??. Daarom moet u utf8mb4 gebruiken, wat een volledige implementatie van UTF-8 is.

 

2. HTML – Correcte declaratie van de tekencodering

In de <head> van uw HTML-pagina's:

Zorg er ook voor dat de CSS/JS-bestanden zijn opgeslagen in UTF-8 (zonder BOM).

Assurez-vous aussi que les fichiers CSS/JS sont enregistrés en UTF-8 (sans BOM). 

 

3. PHP – UTF-8 of UTF-8MB4 forceren

a) HTTP-headers

header('Content-Type: text/html; charset=utf-8');

b) MySQL-verbinding (MySQL API)

b) Connexion MySQL (API MySQL)

$connection = mysql_connect($host, $user, $pass);
mysql_set_charset('utf8mb4', $connection);

c) PDO-verbinding

 $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) Configuratie in phpMyAdmin

  • De database, tabellen en kolommen moeten de codering utf8mb4_unicode_ci of utf8mb4_general_ci hebben.
  • In het tabblad Operaties kiest u utf8mb4_unicode_ci voor de collatie.

b) Nuttige SQL-opdrachten

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) Na de PHP-verbinding

mysqli_query($conn, "SET NAMES 'utf8mb4'");
mysqli_query($conn, "SET CHARACTER SET 'utf8mb4'");

 

5. .user.ini / .htaccess-bestand

Om de codering aan de serverkant (Apache) te forceren:

AddDefaultCharset utf-8
Header set Content-Type "text/html; charset=utf-8"
# Voor PHP
php_value default_charset UTF-8
php_value mbstring.internal_encoding UTF-8

 

6. SQL-dumps importeren/exporteren

Fouten waarbij é bijvoorbeeld verandert in ? of een emoji ☺ verandert in ??, komen vaak voor doordat de tekencodering niet correct is ingesteld.

Controleer de codering van het SQL-bestand voordat u het importeert. Gebruik indien nodig iconv:

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

Geef in phpMyAdmin de importcodering op (bijvoorbeeld UTF-8, UTF-8MB4 of latin1, afhankelijk van het bestand).

Link naar deze veelgestelde vragen: https://faq.infomaniak.com/1124


Is deze veelgestelde vragenlijst nuttig geweest?