(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)
mb_detect_encoding — Détecte un encodage
$string, array|string|null $encodings = null, bool $strict = false): string|false
Détecte l'encodage le plus probable pour la chaîne de caractères
string depuis une liste de candidats.
À partir de PHP 8.1, cette fonction utilise des heuristiques pour détecter lequel des encodages de texte valides dans la liste spécifiée
est le plus susceptible d'être correct et peut ne pas être dans l'ordre des encodings fournis.
La détection automatique du jeu d'encodage prévu n'est jamais totalement fiable ; sans information additionnelle, c'est similaire à décoder une chaîne chiffrée sans la clé. Il est toujours préférable d'utiliser une indication du jeu d'encodage stockée ou transmise avec les données, tel que l'en-tête HTTP "Content-Type".
Cette fonction est la plus utile avec les encodages multioctets, où pas toutes les séquences d'octets forment une chaîne valide. Si la chaîne d'entrée contient une telle séquence, cet encodage sera rejeté.
Le nom de cette fonction est trompeur, elle effectue une « supposition » plutôt qu’une « détection ».
Les suppositions sont loin d’être précises, et par conséquent, cette fonction ne permet pas de détecter avec fiabilité l’encodage correct des caractères.
stringLa string inspectée.
encodingsUne liste d'encodages de caractères à essayer. Cette liste peut être spécifiée comme un tableau de chaîne de caractères, ou en tant qu'une chaîne de caractères unique séparée par des virgules.
Si encodings est omis ou null,
le detect_order actuel (défini avec l'option de configuration
mbstring.detect_order,
ou la fonction mb_detect_order()) sera utilisé.
strict
Contrôle le comportement quand string n'est
valide dans aucun des encodings listés.
Si strict est défini à false, l'encodage qui
correspond le plus sera retourné ; si strict
est défini à true, false sera retourné.
La valeur par défaut de strict peut être définie
avec l'option de configuration
mbstring.strict_detection.
L'encodage de caractère détecté, ou false si la chaîne n'est valide
dans aucun des encodages listés.
| Version | Description |
|---|---|
| 8.2.0 |
mb_detect_encoding() ne renverra plus
les encodages non textuels suivants :
"Base64", "QPrint",
"UUencode", "HTML entities",
"7 bit" et "8 bit".
|
Exemple #1 Exemple avec mb_detect_encoding()
<?php
$str = "\x95\xB6\x8E\x9A\x83\x52\x81\x5B\x83\x68";
// Détecte l'encodage avec le detect_order actuel
var_dump(mb_detect_encoding($str));
// "auto" est modifié selon mbstring.language
var_dump(mb_detect_encoding($str, "auto"));
// Spécifie le paramètre "encodings" avec une liste à virgules
var_dump(mb_detect_encoding($str, "JIS, eucjp-win, sjis-win"));
// Utilisation d'un tableau pour spécifier le paramètre "encodings"
$encodings = [
"ASCII",
"JIS",
"EUC-JP"
];
var_dump(mb_detect_encoding($str, $encodings));
?>L'exemple ci-dessus va afficher :
string(5) "ASCII" string(5) "ASCII" string(8) "SJIS-win" string(5) "ASCII"
Exemple #2 Effet du paramètre strict
<?php
// 'áéóú' encodées en ISO-8859-1
$str = "\xE1\xE9\xF3\xFA";
// La chaîne n'est pas valide en ASCII ou UTF-8, mais l'UTF-8 est considéré comme une correspondance plus proche
var_dump(mb_detect_encoding($str, ['ASCII', 'UTF-8'], false));
var_dump(mb_detect_encoding($str, ['ASCII', 'UTF-8'], true));
// Si un encodage valide est trouvé, le paramètre strict ne change pas le résultat
var_dump(mb_detect_encoding($str, ['ASCII', 'UTF-8', 'ISO-8859-1'], false));
var_dump(mb_detect_encoding($str, ['ASCII', 'UTF-8', 'ISO-8859-1'], true));
?>L'exemple ci-dessus va afficher :
string(5) "UTF-8" bool(false) string(10) "ISO-8859-1" string(10) "ISO-8859-1"
Dans certains cas, la même séquence d'octets peut former une chaîne valide dans différents encodages de caractères, et il est impossible de déterminer quelle interprétation était prévue. Un exemple, parmi tant d'autres, la séquence d'octets "\xC4\xA2" pourrait être :
Exemple #3 Effet de l'ordre quand plusieurs encodages correspondent
<?php
$str = "\xC4\xA2";
// La chaîne est valide dans les trois encodages, mais le premier listé n'est pas toujours celui retourné
var_dump(mb_detect_encoding($str, ['UTF-8']));
var_dump(mb_detect_encoding($str, ['UTF-8', 'ISO-8859-1', 'ISO-8859-5'])); // as of php8.1 this returns ISO-8859-1 instead of UTF-8
var_dump(mb_detect_encoding($str, ['ISO-8859-1', 'ISO-8859-5', 'UTF-8']));
var_dump(mb_detect_encoding($str, ['ISO-8859-5', 'UTF-8', 'ISO-8859-1']));
?>L'exemple ci-dessus va afficher :
string(5) "UTF-8" string(10) "ISO-8859-1" string(10) "ISO-8859-1" string(10) "ISO-8859-5"