Signatur
Beschreibung
IntlCodePointBreakIterator ist eine Unterklasse von IntlBreakIterator aus der ICU-Bibliothek und erlaubt das zeichenweise Durchlaufen eines Strings auf der Ebene von Unicode-Codepoints. Im Gegensatz zu einfachem Byte-Zugriff auf einen UTF-8-String wird hier korrekt zwischen einzelnen Unicode-Zeichen unterschieden, auch wenn diese im Speicher mehrere Bytes belegen.
Ein typischer Anwendungsfall ist die Iteration über beliebige Unicode-Texte, bei denen Zeichen aus dem BMP (Basic Multilingual Plane) und Ergänzungsebenen (z. B. Emoji, seltene CJK-Zeichen) gemischt auftreten. Über getLastCodePoint() kann nach jedem Schritt der numerische Codepoint des zuletzt überquerten Zeichens abgerufen werden.
Die Klasse wird typischerweise nicht direkt instanziiert; stattdessen wird die statische Factory-Methode IntlBreakIterator::createCodePointInstance() verwendet, die ein Objekt dieses Typs zurückgibt. Die eigentliche Iteration erfolgt über Methoden wie next(), previous(), current() und rewind(), die von IntlBreakIterator geerbt werden.
Im Vergleich zu IntlGraphemeClusterBreakIterator arbeitet dieser Iterator auf der niedrigeren Codepoint-Ebene und berücksichtigt keine Graphem-Cluster (kombinierte Zeichen, Modifier, ZWJ-Sequenzen). Für reine Codepoint-Analyse ist dieser Iterator jedoch effizienter und ausreichend.
Beispiele
Iteration über Unicode-Codepoints eines Strings
<?php
// Erstellt einen CodePoint-Break-Iterator für einen gemischten Unicode-String
$text = "A\u{1F600}Z"; // A, Emoji 😀, Z
$iter = IntlBreakIterator::createCodePointInstance();
$iter->setText($text);
$prev = 0;
while (($pos = $iter->nextBoundary()) !== IntlBreakIterator::DONE) {
$codePoint = $iter->getLastCodePoint();
printf("Codepoint U+%04X (Position %d bis %d)\n", $codePoint, $prev, $pos);
$prev = $pos;
}
Zählen der Codepoints in einem UTF-8-String
<?php
function countCodePoints(string $text): int {
$iter = IntlBreakIterator::createCodePointInstance();
$iter->setText($text);
$count = 0;
while ($iter->nextBoundary() !== IntlBreakIterator::DONE) {
$count++;
}
return $count;
}
$str = "Héllo\u{1F44D}"; // 6 Codepoints: H é l l o 👍
echo countCodePoints($str) . "\n";
echo mb_strlen($str) . "\n"; // Vergleich: mb_strlen liefert dasselbe Ergebnis
Extrahieren aller Codepoints als Array
<?php
function getCodePoints(string $text): array {
$iter = IntlBreakIterator::createCodePointInstance();
$iter->setText($text);
$codePoints = [];
while ($iter->nextBoundary() !== IntlBreakIterator::DONE) {
$codePoints[] = sprintf('U+%04X', $iter->getLastCodePoint());
}
return $codePoints;
}
print_r(getCodePoints("Hi\u{1F30D}"));
// Wichtig · Fallstricke
Instanziierung: Die Klasse sollte nicht direkt mit new IntlCodePointBreakIterator() erzeugt werden. Verwende stattdessen die Factory-Methode IntlBreakIterator::createCodePointInstance(), die intern das korrekte Objekt erzeugt.
Kein Graphem-Cluster-Bewusstsein: Dieser Iterator arbeitet auf reiner Codepoint-Ebene. Graphem-Cluster (z. B. ein Buchstabe mit kombinierendem Akzent oder ZWJ-Emoji-Sequenzen) werden als mehrere einzelne Codepoints gezählt. Für Graphem-Cluster nutze IntlBreakIterator::createCharacterInstance().
Erweiterung erforderlich: Die Klasse setzt die PHP-Erweiterung intl voraus, die mit ICU kompiliert sein muss. Prüfe mit extension_loaded('intl').