È una domanda un po 'complicata, ma è possibile. Innanzitutto, è necessario normalizzare la stringa Unicode in uno dei 4 moduli. Le informazioni sulla normalizzazione sono here e una mappa di esempi di caratteri con le diverse normalizzazioni è here e un buon grafico per i caratteri normalizzati è here. In sostanza, la normalizzazione si limita ad assicurare che tutti i caratteri siano nello stesso formato quando si gestiscono i segni diacritici. Golang ha un grande supporto per questo, e la maggior parte di tutte le lingue dovrebbe contenere librerie per farlo.
Quindi per il mio esempio, convertire la stringa in "Normalization Form D" (NFD) e utf32, quindi tutti i caratteri Unicode sono i loro punti di codice in 4 byte.
Tutti i caratteri diacritici per l'accento grave hanno 0x0300 accanto al carattere. Quindi puoi eseguire una ricerca di espressioni regolari in modalità ascii (modalità non Unicode) per ....\x00\x00\x03\x00
. Da lì dovrai estrarre la posizione della runa in cui si trova. Ciò può essere fatto con metodi diversi a seconda della codifica che stai utilizzando.
Quindi se atterri su una divisione di 4, saprai che è un carattere valido.
Oltre a questo, non ci sono gruppi di caratteri perl ufficiali per farlo.
codice Perl come esempio:
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");
}
}
Ma a questo punto, si potrebbe anche solo essere facendo un ciclo for nel corso dei personaggi: - \
Ho anche provato corrispondenza senza bisogno della posizione prova usando // c, ma per qualche motivo non funzionerebbe.
/^(?:....)*?(....\x00\x00\x03\x00)/gcs
Se si tratta di un carattere di combinazione, ciò potrebbe essere possibile [generando un elenco di codepoint unicode] (http://stackoverflow.com/questions/17051732/algorithm-to-check-for-combining-characters-in-unicode). – kba
Creare una classe di caratteri con lettere singole non è affidabile e non funzionerebbe.Funzionerebbe solo per le lettere precomposte che corrispondono alle stringhe NFC (modulo di normalizzazione composto). La maggior parte dei personaggi con due o più segni diacritici non ha carattere precomposto. Cioè sono costituiti da più di un punto di codice (= carattere nel parlato Unicode). Se le copi e le incolli in una classe di caratteri, il segno diacritico è ancora un singolo carattere e corrisponderà agli stessi singoli segni diacritici nella stringa di destinazione. –