To trochę trudne pytanie, ale jest to możliwe. Najpierw musisz znormalizować ciąg unicode w jednym z 4 formularzy. Informacje na temat normalizacji to here, a mapa przykładów znaków z różnymi normalizacjami to here, a dobrym wykresem dla znormalizowanych znaków jest here. Zasadniczo, normalizacja po prostu zapewnia, że wszystkie znaki są w tym samym formacie podczas posługiwania się znakami diakrytycznymi. Golang ma wielkie poparcie dla tego, a większość języków powinna zawierać biblioteki do tego.
Tak więc dla mojego przykładu skonwertuj ciąg znaków do "Normalization Form D" (NFD) i utf32, więc wszystkie znaki Unicode są ich punktami kodowymi w 4 bajtach.
Wszystkie znaki diakrytyczne dla akcentu poważnego mają 0x0300 obok znaku. Możesz więc użyć wyszukiwania wyrażenia regularnego w trybie ASCII (NIE w trybie Unicode) dla ....\x00\x00\x03\x00
. Stamtąd musisz wyodrębnić, w której lokalizacji runy. Można to zrobić różnymi metodami w zależności od używanego kodowania.
Więc jeśli wylądujesz w dziale 4, będziesz znać jego prawidłową postać.
Oprócz tego nie istnieją oficjalne grupy znaków perla, które mogłyby to zrobić.
kod Perl jako przykład:
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");
}
}
Ale w tym momencie, to równie dobrze może być po prostu robi dla pętli ciągu znaków: - \
Próbowałem też dopasowanie bez potrzeby pozycję przetestuj używając // c, ale z jakiegoś powodu to nie zadziała.
/^(?:....)*?(....\x00\x00\x03\x00)/gcs
Jeśli jest to znak łączący, może to być możliwe przez [generowanie listy punktów kodowych unikodowych] (http://stackoverflow.com/questions/17051732/algorithm-to-check-for-combing-character-in-unicode). – kba
Stwórz klasę znaków z pojedynczych liter nie jest niezawodny i nie działałby.Działałoby to tylko dla wstępnie skomponowanych liter pasujących do NFC (złożona forma normalizacyjna). Większość postaci z dwoma lub więcej znakami diakrytycznymi nie ma wstępnego charakteru. To znaczy. składają się z więcej niż jednego punktu kodowego (= znak w mowie Unicode). Jeśli skopiujesz i wkleisz je do klasy znaków, znak diakrytyczny nadal będzie pojedynczym znakiem i będzie pasował do tych samych znaków diakrytycznych w ciągu docelowym. –