Start · Sprachen · PHP · Referenz · normalizer_is_normalized

normalizer_is_normalized

Funktion

Prüft, ob ein String bereits in der angegebenen Unicode-Normalisierungsform (NFC, NFD, NFKC, NFKD) vorliegt.

seit PHP 5.3.0 Kategorie: string

Signatur

normalizer_is_normalized(string $string, int $form = Normalizer::FORM_C): bool

Beschreibung

normalizer_is_normalized() ist die prozedurale Entsprechung zur Methode Normalizer::isNormalized() aus der intl-Extension. Sie prüft, ob ein gegebener UTF-8-String bereits in der gewünschten Unicode-Normalisierungsform vorliegt, ohne dabei eine Normalisierung durchzuführen.

Unicode-Normalisierung ist bei der Verarbeitung von Texten aus unterschiedlichen Quellen wichtig, da dasselbe Zeichen auf mehrere Arten kodiert werden kann (z. B. ein zusammengesetztes Zeichen vs. Basiszeichen + Kombinations-Zeichen). Bevor man zwei Strings vergleicht oder in einer Datenbank speichert, sollte man sicherstellen, dass beide in der gleichen Normalisierungsform vorliegen.

Die Funktion eignet sich gut als schnelle Vorbedingungsprüfung: Liegt der String bereits in der gewünschten Form vor, spart man sich den Aufruf von normalizer_normalize(). Typischerweise wird NFC (Normalizer::FORM_C) für Webinhalte und Datenbankeinträge verwendet.

Verfügbare Normalisierungsformen sind: Normalizer::FORM_C (NFC), Normalizer::FORM_D (NFD), Normalizer::FORM_KC (NFKC) und Normalizer::FORM_KD (NFKD). Die Funktion benötigt die PHP-Extension intl.

Parameter

Name Typ Default Beschreibung
$string Pflicht string Der zu prüfende UTF-8-String.
$form int Normalizer::FORM_C Die Normalisierungsform als Konstante: Normalizer::FORM_C (NFC), Normalizer::FORM_D (NFD), Normalizer::FORM_KC (NFKC) oder Normalizer::FORM_KD (NFKD).

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der String bereits in der angegebenen Normalisierungsform vorliegt, andernfalls false. Gibt ebenfalls false zurück, wenn der String kein gültiges UTF-8 enthält.

Beispiele

Prüfung auf NFC-Normalisierung

<?php
// NFC-normalisierter String (zusammengesetztes Zeichen ü als ein Codepoint U+00FC)
$nfc = "\xC3\xBC"; // ü als prekomponiertes Zeichen

// NFD-String (u + Combining Diaeresis: U+0075 + U+0308)
$nfd = "u\xCC\x88";

var_dump(normalizer_is_normalized($nfc, Normalizer::FORM_C)); // true
var_dump(normalizer_is_normalized($nfd, Normalizer::FORM_C)); // false
var_dump(normalizer_is_normalized($nfd, Normalizer::FORM_D)); // true
bool(true) bool(false) bool(true)

Effiziente bedingte Normalisierung

<?php
function ensureNFC(string $input): string {
    if (normalizer_is_normalized($input, Normalizer::FORM_C)) {
        // String ist bereits NFC — keine Konvertierung nötig
        return $input;
    }
    return normalizer_normalize($input, Normalizer::FORM_C);
}

$text = "Cafe\xCC\x81"; // "Café" in NFD (e + combining acute)
echo ensureNFC($text); // Gibt "Café" in NFC aus
echo "\n";
var_dump(normalizer_is_normalized(ensureNFC($text), Normalizer::FORM_C));
Café bool(true)

// Wichtig · Fallstricke

Voraussetzung: Die PHP-Extension intl muss installiert und aktiviert sein. Ohne sie ist weder normalizer_is_normalized() noch die Klasse Normalizer verfügbar.

Ungültige Eingaben: Enthält der String kein gültiges UTF-8, gibt die Funktion false zurück und erzeugt eine Warnung. Eine Eingabevalidierung mit mb_check_encoding($string, 'UTF-8') ist daher empfehlenswert.

Performance: Die Prüfung ist deutlich schneller als eine vollständige Normalisierung mittels normalizer_normalize(). Bei großen Textmengen lohnt sich daher die kombinierte Nutzung beider Funktionen wie im zweiten Beispiel gezeigt.