Hier - und vermutlich auch in allen anderen entprechenden Posts im Deutschen Lazarusforum zu diesem Thema -
geht es um:
Code: Alles auswählen
var
c: Char;
s: String;
begin
s := 'ä';
c := s[1];
ShowMessage(c); // Gibt leere Meldung aus
end;
var
s1, s2: String;
begin
s1 := 'ä';
s2 := s1[1] + s1[2];
ShowMessage(s2); // Gibt ä aus
end;
Zeichen im Unicodebereich über $d7ff werden auf zwei 16Bit UnicodeChar aufgeteilt (=Surrogate Pair), das erste 16 Bit Element (=Codeunit) im Bereich $d800..$dbff, das zweite im Bereich $dc00..dfff. Für alle 16Bit Zeichen (=Codepoint) im Bereich < $d800 gibt es also keine Überlappung mit aufgeteilten Zeichen im Unicodebereich > $ffff.
Im Bereich $10000 bis $10ffff liegen hauptsächlich Codepoints toter Sprachen und selten gebrauchte Spezialzeichen.
Wenn ihr also nach Schriftzeichen lebender Sprachen sucht, könnt ihr bedenkenlos UnicodeString und UnicodeChar einsetzen, auch wenn im zu durchsuchenden Text beliebige aufgeteilte Codepoints vorkommen. Ein Surrogate Pair wird lediglich zu zwei für euch unbekannte Zeichen über die ihr im Suchen hinweggeht.
Das Einzige was ihr nicht tun solltet, ist das Aufteilen eines UnicodeString zwischen einem aufgeteilten Codepoint (Surrogate Pair), da dann das letzte Zeichen des Start-strings das erste Zeichen des End-strings ungültig werden. Ich glaube aber, dass dies in allen im Deutschen Lazarus Forum geschilderten Umlautproblemen nicht passieren kann.
Wenn ihr nach Zeichen in toten Sprachen sucht, wird es schwieriger. Dies ist aber sowieso Spezialistenarbeit denn da gibt es sehr viel zu berücksichtigen wie z.B. aus mehreren Codepoints zusammengesetzen Zeichen und die Schreibrichtung.