Start · Sprachen · PHP · Referenz · Transliterator

Transliterator

Klasse

Führt Transliterationen von Text nach ICU-Regeln durch, z. B. Umschrift von Unicode-Zeichen in ASCII oder zwischen verschiedenen Schriftsystemen.

seit PHP 5.4.0 Kategorie: string

Signatur

class Transliterator

Beschreibung

Die Klasse Transliterator ist Teil der intl-Erweiterung und basiert auf der ICU-Bibliothek (International Components for Unicode). Sie ermöglicht die Transformation von Zeichenketten nach definierten Regeln, zum Beispiel die Transliteration von Kyrillisch nach Latein, von Latein nach ASCII (Entfernung von Akzenten/Diakritika) oder benutzerdefinierte Regelersetzungen.

Instanzen können nicht direkt mit new erzeugt werden; stattdessen werden die statischen Factory-Methoden Transliterator::create() (für benannte ICU-Transliteratoren) oder Transliterator::createFromRules() (für eigene Regelstrings im ICU-Format) verwendet.

Typische Einsatzgebiete sind das Normalisieren von Strings für URLs (Slugs), das Vereinheitlichen von Sucheingaben, die Umschrift fremder Schriften in das Lateinalphabet sowie das Entfernen von Sonderzeichen für systemkompatible Dateinamen.

Der in einer Instanz enthaltene Transliterator kann auch in Gegenrichtung angewendet werden, sofern er invertierbar ist – hierfür steht Transliterator::createInverse() zur Verfügung.

Beispiele

Akzente und Diakritika entfernen (Slug-Erzeugung)

<?php
// Benannter ICU-Transliterator: Latein nach ASCII
$t = Transliterator::create('Any-Latin; Latin-ASCII');

$input = 'Héllo Wörld – Ñoño & Ångström';
$result = $t->transliterate($input);

echo $result;
// Ausgabe: Hello World - Nono & Angstrom

// Weiterverarbeitung zu einem URL-Slug
$slug = strtolower(preg_replace('/[^a-z0-9]+/i', '-', $result));
echo $slug; // hello-world-nono-angstrom
Hello World - Nono & Angstrom hello-world-nono-angstrom

Kyrillisch nach Latein transliterieren

<?php
$t = Transliterator::create('Russian-Latin/BGN');

if ($t === null) {
    echo 'Transliterator konnte nicht erstellt werden: ' . intl_get_error_message();
    exit;
}

$cyrillic = 'Привет, мир!';
$latin = $t->transliterate($cyrillic);

echo $latin;
Privet, mir!

Benutzerdefinierte Regeln mit createFromRules()

<?php
// Eigene ICU-Regel: 'ä' -> 'ae', 'ö' -> 'oe', 'ü' -> 'ue', 'ß' -> 'ss'
$rules = 'ä > ae; ö > oe; ü > ue; Ä > Ae; Ö > Oe; Ü > Ue; ß > ss;';
$t = Transliterator::createFromRules($rules, Transliterator::FORWARD);

$text = 'Müller kauft Äpfel und Öl für sein Straße-Büro.';
echo $t->transliterate($text);
Mueller kauft Aepfel und Oel fuer sein Strasse-Buero.

Verfügbare Transliteratoren auflisten

<?php
$ids = Transliterator::listIDs();

// Ersten 5 verfügbaren IDs ausgeben
foreach (array_slice($ids, 0, 5) as $id) {
    echo $id . PHP_EOL;
}
ASCII-Latin Arabic-Latin Armenian-Latin Bengali-Latin Bopomofo-Latin

// Wichtig · Fallstricke

Instanziierung: new Transliterator() ist nicht erlaubt; die Klasse besitzt einen privaten Konstruktor. Verwende ausschließlich Transliterator::create(), Transliterator::createFromRules() oder Transliterator::createInverse().

Fehlerbehandlung: Schlägt die Erstellung fehl, geben die Factory-Methoden null zurück (nicht false). Fehlermeldungen sind über intl_get_error_message() und intl_get_error_code() abrufbar. Ebenso liefern $t->getErrorCode() und $t->getErrorMessage() Instanz-bezogene Fehlerinformationen.

Encoding: Ein- und Ausgabestrings müssen in UTF-8 vorliegen. Andere Encodings führen zu falschen oder leeren Ergebnissen ohne explizite Fehlermeldung.

Performance: Für viele Transliterationen desselben Typs sollte eine Transliterator-Instanz einmalig erzeugt und wiederverwendet werden, da das Parsen der ICU-Regeln aufwändig sein kann.