Es ist eine knifflige Frage, aber es ist möglich. Zuerst müssen Sie die Unicode-Zeichenfolge in eine der 4 Formen normalisieren. Informationen zur Normalisierung sind here, und eine Zuordnung von Zeichenbeispielen mit den verschiedenen Normalisierungen ist here, und ein gutes Diagramm für die normalisierten Zeichen ist here. Im Wesentlichen stellt das Normalisieren nur sicher, dass alle Zeichen im selben Format sind, wenn sie mit Diakritika umgehen. Golang hat dafür eine große Unterstützung, und die meisten Sprachen sollten Bibliotheken dafür enthalten.
Also für mein Beispiel, konvertieren Sie Ihre Zeichenfolge in "Normalisierung Form D" (NFD) und utf32, so dass alle Unicode-Zeichen sind ihre Codepunkte in 4 Bytes.
Alle diakritischen Zeichen für den Grabakzent haben 0x0300 neben dem Zeichen. Sie können also einen regulären Ausdruck im ASCII-Modus (NICHT im Unicode-Modus) für ....\x00\x00\x03\x00
suchen. Von dort müsstest du herausfinden, in welchem Runen-Ort es sich befindet. Das kann mit verschiedenen Methoden geschehen, abhängig davon, welche Kodierung du verwendest.
Wenn Sie also auf eine Division von 4 landen, wissen Sie, dass es sich um einen gültigen Charakter handelt.
Darüber hinaus gibt es keine offiziellen Perl-Zeichengruppierungen, um dies zu tun.
Perl-Code als Beispiel:
use Encode;
use Unicode::Normalize;
$StartUTF8='xàaâèaê';
$PerlEncoded=decode('utf8', $StartUTF8);
$PerlNormalized=NFD($PerlEncoded);
$UTF32Normalized=encode('utf32', $PerlNormalized);
while($UTF32Normalized =~ /(....\x00\x00\x03\x00)/gs) {
$Pos=pos($UTF32Normalized)-8;
if($Pos%4==0) {
print("$Pos\n");
}
}
Aber an diesem Punkt, dann kann man auch nur eine for-Schleife über die Zeichen tun: - \
Ich versuchte auch ohne Anpassung der Position zu benötigen Test mit // c, aber aus irgendeinem Grund würde es nicht funktionieren.
/^(?:....)*?(....\x00\x00\x03\x00)/gcs
Wenn es ein Kombinationszeichen ist, das könnte möglich sein, durch [eine Liste von Unicode-Codepunkten zu erzeugen] (http://stackoverflow.com/questions/17051732/algorithm-to-check-for-combining-characters-in-unicode). – kba
Machen Sie eine Zeichenklasse aus einzelnen Buchstaben ist nicht zuverlässig und würde nicht funktionieren.Es würde nur für vorkomparierte Buchstaben funktionieren, die Strings NFC (Normalisierungsform zusammengesetzt) entsprechen. Die meisten Zeichen mit zwei oder mehr Diakritika haben keinen vorkomparierten Charakter. I.e. Sie bestehen aus mehr als einem Codepunkt (= Zeichen in Unicode-Sprache). Wenn Sie sie kopieren und in eine Zeichenklasse einfügen, ist das Diakritikum immer noch ein einzelnes Zeichen und wird mit den gleichen einzelnen Diakritika in der Zielzeichenfolge übereinstimmen. –