Signatur
Beschreibung
normalizer_get_raw_decomposition() gibt die im Unicode-Zeichendatensatz hinterlegte Decomposition_Mapping-Eigenschaft für genau einen UTF-8-Codepoint zurück. Im Gegensatz zu normalizer_normalize(), das komplette Strings normalisiert, arbeitet diese Funktion auf der Ebene eines einzelnen Zeichens und liefert die rohe Zerlegung direkt aus der Unicode-Datenbank, ohne weitere Faltungs- oder Kompositionsschritte.
Die Funktion eignet sich besonders dann, wenn man gezielt wissen möchte, wie ein bestimmtes Zeichen kanonisch oder kompatibel zerlegt wird – etwa bei der Implementierung eigener Normalisierungsroutinen, bei der Analyse von Unicode-Zeichen oder beim Debuggen von Zeichenkodierungsproblemen.
Der Parameter form erlaubt die Wahl zwischen kanonischer Zerlegung (Normalizer::NFD / Normalizer::NFKD) und Kompatibilitätszerlegung. Zeichen ohne eingetragene Zerlegung liefern null zurück.
Die Funktion ist Teil der Intl-Erweiterung und steht als prozedurale Entsprechung zur Methode Normalizer::getRawDecomposition() zur Verfügung.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $input Pflicht | string | Ein einzelner UTF-8-codierter Codepoint, dessen Decomposition_Mapping abgefragt werden soll. Enthält der String mehr als einen Codepoint, gibt die Funktion null zurück. |
|
| $form | int | Normalizer::FORM_NFC | Die Unicode-Normalisierungsform. Typischerweise wird Normalizer::NFD für kanonische oder Normalizer::NFKD für Kompatibilitätszerlegung verwendet. Konstanten der Klasse Normalizer verwenden. |
Rückgabewert
null, wenn der Codepoint keine Zerlegung besitzt, der Eingabe-String leer ist oder mehr als einen Codepoint enthält.Beispiele
Zerlegung eines zusammengesetzten Zeichens abfragen
<?php
// 'ä' (U+00E4) hat eine kanonische Zerlegung in 'a' + Combining Diaeresis (U+0308)
$zeichen = "\u{00E4}"; // ä
$zerlegung = normalizer_get_raw_decomposition($zeichen, Normalizer::NFD);
if ($zerlegung !== null) {
echo "Zerlegung gefunden: ";
// Hexadezimale Codepoints ausgeben
$laenge = mb_strlen($zerlegung);
for ($i = 0; $i < $laenge; $i++) {
$cp = mb_substr($zerlegung, $i, 1);
echo sprintf('U+%04X ', mb_ord($cp));
}
echo PHP_EOL;
} else {
echo "Keine Zerlegung vorhanden." . PHP_EOL;
}
Zeichen ohne Zerlegung und Fehlerfall
<?php
// 'a' (U+0061) hat keine Zerlegung
$ohneZerlegung = normalizer_get_raw_decomposition('a', Normalizer::NFD);
var_dump($ohneZerlegung); // NULL
// Mehr als ein Codepoint liefert ebenfalls NULL
$mehrereCodepoints = normalizer_get_raw_decomposition('ab', Normalizer::NFD);
var_dump($mehrereCodepoints); // NULL
// Kompatibilitätszerlegung: 'fi' (U+FB01, fi-Ligatur)
$ligatur = "\u{FB01}";
$kompat = normalizer_get_raw_decomposition($ligatur, Normalizer::NFKD);
if ($kompat !== null) {
echo "Kompatibilitätszerlegung von fi: " . $kompat . PHP_EOL; // fi
}
// Wichtig · Fallstricke
Achtung: Die Funktion erwartet exakt einen UTF-8-Codepoint als Eingabe. Strings mit mehreren Zeichen werden stillschweigend mit null quittiert, ohne eine Warnung auszugeben. Es empfiehlt sich daher, die Eingabe vorab mit mb_strlen() zu prüfen.
Die Funktion setzt die Intl-Erweiterung voraus (ext-intl), die standardmäßig nicht in jeder PHP-Installation aktiv ist. Prüfe mit extension_loaded('intl') die Verfügbarkeit.
Sie steht erst ab PHP 7.3.0 zur Verfügung. Für ältere Versionen gibt es keine direkte Alternative in der Intl-Erweiterung.