Signatur
Beschreibung
mb_detect_encoding() versucht, die Zeichenkodierung des übergebenen Strings zu ermitteln. Die Funktion prüft dabei nacheinander alle angegebenen Kodierungen und gibt die erste zurück, die zur Bytesequenz des Strings passt. Dies ist besonders nützlich, wenn man Strings aus unbekannten Quellen (z. B. Dateiuploads, externe APIs, E-Mail-Inhalte) verarbeiten muss und sicherstellen möchte, mit welcher Kodierung man es zu tun hat.
Über den Parameter $encodings kann eine geordnete Liste von Kandidaten-Kodierungen übergeben werden – entweder als Array oder als kommagetrennte Zeichenkette. Wird null übergeben, nutzt PHP die intern mit mb_detect_order() festgelegte Reihenfolge. Typische Kandidaten sind UTF-8, ISO-8859-1, Windows-1252 und ASCII.
Mit dem Parameter $strict lässt sich steuern, ob die Erkennung strikt erfolgen soll: Im strikten Modus muss die gesamte Bytesequenz zur jeweiligen Kodierung passen; im nicht-strikten Modus (Standard) wird die erste teilweise passende Kodierung zurückgegeben, was zu Fehlerkennungen führen kann. Für produktive Anwendungen wird der strikte Modus empfohlen.
Kann keine passende Kodierung gefunden werden, gibt die Funktion false zurück. Da verschiedene Kodierungen ähnliche Bytesequenzen aufweisen können (z. B. ASCII ist eine Teilmenge von UTF-8 und ISO-8859-1), sollte die Reihenfolge der Kandidaten sorgfältig gewählt werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $string Pflicht | string | Der zu prüfende String, dessen Zeichenkodierung erkannt werden soll. | |
| $encodings | array|string|null | null | Liste der zu prüfenden Kodierungen als Array oder kommagetrennte Zeichenkette (z. B. 'UTF-8, ISO-8859-1, Windows-1252'). Bei null wird die mit mb_detect_order() gesetzte Reihenfolge verwendet. |
| $strict | bool | false | Wenn true, muss die gesamte Bytesequenz strikt zur erkannten Kodierung passen. Empfohlen für zuverlässigere Ergebnisse in produktiven Umgebungen. |
Rückgabewert
'UTF-8'), oder false, wenn keine der angegebenen Kodierungen passt.Beispiele
Einfache Kodierungserkennung mit UTF-8 und ISO-8859-1
<?php
$utf8String = 'Héllo Wörld'; // UTF-8-kodierter String
$latin1String = mb_convert_encoding('Héllo Wörld', 'ISO-8859-1', 'UTF-8');
$kandidaten = ['UTF-8', 'ISO-8859-1', 'ASCII'];
$enc1 = mb_detect_encoding($utf8String, $kandidaten, true);
$enc2 = mb_detect_encoding($latin1String, $kandidaten, true);
echo "UTF-8-String erkannt als: $enc1\n";
echo "ISO-8859-1-String erkannt als: $enc2\n";
Praxisbeispiel: Eingabe in UTF-8 konvertieren
<?php
function normalizeToUtf8(string $input): string
{
$erkannte = mb_detect_encoding($input, ['UTF-8', 'Windows-1252', 'ISO-8859-1', 'ASCII'], true);
if ($erkannte === false) {
throw new RuntimeException('Zeichenkodierung konnte nicht erkannt werden.');
}
if ($erkannte === 'UTF-8') {
return $input; // bereits UTF-8, keine Konvertierung nötig
}
return mb_convert_encoding($input, 'UTF-8', $erkannte);
}
$latin1 = mb_convert_encoding('Ärger mit Übergröße', 'ISO-8859-1', 'UTF-8');
$result = normalizeToUtf8($latin1);
echo $result;
Verwendung der globalen Erkennungsreihenfolge
<?php
// Globale Erkennungsreihenfolge festlegen
mb_detect_order(['UTF-8', 'ISO-8859-1', 'ASCII']);
$string = 'Simple ASCII text';
// encodings = null → nutzt die globale Reihenfolge
$enc = mb_detect_encoding($string, null, true);
echo "Erkannte Kodierung: $enc\n";
// Wichtig · Fallstricke
Fehlerkennungen: Die automatische Kodierungserkennung ist heuristisch und nicht zuverlässig, da viele Kodierungen kompatible Bytesequenzen besitzen. Insbesondere ist rein ASCII-kompatibler Text in UTF-8, ISO-8859-1 und Windows-1252 identisch, weshalb die Reihenfolge der Kandidaten entscheidend ist.
Strikter Modus empfohlen: Ohne $strict = true kann die Funktion eine falsche Kodierung zurückgeben, da bereits eine teilweise Übereinstimmung genügt. In produktiven Anwendungen sollte stets true übergeben werden.
Begrenzte Kodierungsunterstützung: mb_detect_encoding() unterstützt nicht alle möglichen Kodierungen; komplexe oder seltene Kodierungen wie UTF-16 oder UTF-32 können zu unzuverlässigen Ergebnissen führen. Für diese Fälle bietet sich die Erkennung über einen BOM (Byte Order Mark) an.