Start · Sprachen · PHP · Referenz · normalizer_normalize

normalizer_normalize

Funktion

Normalisiert einen Unicode-String in eine der vier Unicode-Normalisierungsformen und gibt den normalisierten String zurück.

seit PHP 5.3.0 Kategorie: string

Signatur

normalizer_normalize(string $string, int $form = Normalizer::FORM_C): string|false

Beschreibung

normalizer_normalize() wandelt einen UTF-8-kodierten String in eine bestimmte Unicode-Normalisierungsform um. Unicode kennt vier Normalisierungsformen: NFC (Composed), NFD (Decomposed), NFKC (Compatibility Composed) und NFKD (Compatibility Decomposed). Diese Formen unterscheiden sich darin, wie zusammengesetzte Zeichen (z. B. Umlaute mit Akzenten) intern dargestellt werden.

Die Funktion ist besonders wichtig beim Vergleichen, Sortieren oder Speichern von Texten, die aus unterschiedlichen Quellen stammen. Ein und dasselbe Zeichen (z. B. é) kann in Unicode als einzelnes Codepoint oder als Kombination aus Basis-Buchstabe und Kombinationszeichen vorliegen – ohne Normalisierung scheitern einfache String-Vergleiche.

Typische Einsatzbereiche sind: Verarbeitung von Benutzereingaben in mehrsprachigen Anwendungen, Datenbankabfragen mit Unicode-Inhalten, Dateinamen-Normalisierung sowie Vergleich von Strings aus verschiedenen Betriebssystemen (macOS nutzt z. B. NFD, während Linux und Windows meist NFC verwenden).

Die Funktion ist die prozedurale Entsprechung der Methode Normalizer::normalize() aus der intl-Erweiterung und benötigt diese Extension. Wenn die intl-Extension nicht geladen ist, steht die Funktion nicht zur Verfügung.

Parameter

Name Typ Default Beschreibung
$string Pflicht string Der zu normalisierende UTF-8-kodierte Eingabe-String.
$form int Normalizer::FORM_C Die gewünschte Normalisierungsform. Mögliche Werte sind: Normalizer::FORM_C (NFC), Normalizer::FORM_D (NFD), Normalizer::FORM_KC (NFKC), Normalizer::FORM_KD (NFKD) sowie Normalizer::FORM_NFC, Normalizer::FORM_NFD, Normalizer::FORM_NFKC, Normalizer::FORM_NFKD als Aliase.

Rückgabewert

Typ
string|false
Beschreibung
Gibt den normalisierten String zurück, oder false, wenn ein Fehler auftritt (z. B. wenn der Eingabe-String kein gültiges UTF-8 ist oder die Normalisierung fehlschlägt).

Beispiele

Normalisierung eines zusammengesetzten Unicode-Zeichens

<?php
// Das Zeichen 'é' kann als NFC (1 Codepoint) oder NFD (2 Codepoints) vorliegen
$nfc = "\xC3\xA9";           // é als NFC (U+00E9)
$nfd = "e\xCC\x81";          // é als NFD (e + kombinierender Akzent)

echo strlen($nfc) . "\n";   // 2 (Bytes)
echo strlen($nfd) . "\n";   // 3 (Bytes)
echo ($nfc === $nfd ? 'gleich' : 'ungleich') . "\n"; // ungleich

$normalized_nfc = normalizer_normalize($nfd, Normalizer::FORM_C);
echo ($nfc === $normalized_nfc ? 'gleich' : 'ungleich') . "\n"; // gleich
echo strlen($normalized_nfc) . "\n"; // 2
2 3 ungleich gleich 2

Plattformübergreifende Dateinamen normalisieren

<?php
// macOS liefert Dateinamen oft in NFD, Linux/Windows erwarten NFC
function normalizeFilename(string $filename): string
{
    $normalized = normalizer_normalize($filename, Normalizer::FORM_C);
    if ($normalized === false) {
        throw new \InvalidArgumentException('Ungültiger UTF-8-String: ' . $filename);
    }
    return $normalized;
}

$macFilename = "Ru\xCC\x88ckgabe.txt"; // Rückgabe.txt in NFD
$linuxFilename = "R\xC3\xBCckgabe.txt"; // Rückgabe.txt in NFC

$normalized = normalizeFilename($macFilename);
echo ($normalized === $linuxFilename ? 'Dateien sind identisch' : 'Dateien unterscheiden sich') . "\n";
echo $normalized . "\n";
Dateien sind identisch Rückgabe.txt

Kompatibilitätsnormalisierung mit NFKC

<?php
// NFKC normalisiert auch Kompatibilitätszeichen, z. B. Ligatur 'fi' zu 'fi'
$ligature = "\xEF\xAC\x81"; // fi (U+FB01, Ligatur fi)

$nfc  = normalizer_normalize($ligature, Normalizer::FORM_C);
$nfkc = normalizer_normalize($ligature, Normalizer::FORM_KC);

echo "NFC:  " . $nfc  . " (Länge: " . strlen($nfc)  . ")\n";
echo "NFKC: " . $nfkc . " (Länge: " . strlen($nfkc) . ")\n";
NFC: fi (Länge: 3) NFKC: fi (Länge: 2)

// Wichtig · Fallstricke

Voraussetzung: Die PHP-Extension intl muss installiert und aktiviert sein. Ohne diese Extension ist normalizer_normalize() nicht verfügbar.

Rückgabe-Prüfung: Der Rückgabewert sollte immer mit === false geprüft werden, da ein leerer String ('') ebenfalls ein gültiges Ergebnis sein kann.

Performance: Bei der Verarbeitung großer Textmengen empfiehlt es sich, zuerst mit normalizer_is_normalized() zu prüfen, ob der String bereits normalisiert ist, bevor eine erneute Normalisierung durchgeführt wird.

Formwahl: Für die meisten Anwendungen (Datenbank, Web) ist NFC (Normalizer::FORM_C) die empfohlene Form. NFKC eignet sich für Suche und Vergleich, wenn auch typografische Varianten (Ligaturen, Breitstellen) gleichbehandelt werden sollen, kann aber Informationen verlieren.