Обнаружение и получение кодовых точек и суррогатов из строки Delphi

Я пытаюсь лучше понять суррогатные пары и реализацию Unicode в Delphi.

Если я вызову length () для строки Unicode S: = 'Ĥà̲V̂e' в Delphi, я вернусь, 8.

Это связано с тем, что длины отдельных символов [Ĥ], [à̲], [V̂] и [e] равны 2, 3, 2 и 1 соответственно. Это потому, что у Ĥ есть суррогат, у ̲ есть два дополнительных суррогата, у V̂ есть суррогат, а у e нет суррогатов.

Если бы я хотел вернуть второй элемент в строке, включая все суррогаты, [à̲], как бы я это сделал? Я знаю, что мне нужно было бы провести какое-то тестирование отдельных байтов. Я провел несколько тестов, используя процедуру

function GetFirstCodepointSize(const S: UTF8String): Integer;  

упоминается вэто ТАК Вопрос.

но получили некоторые необычные результаты, например, вот некоторые длины и размеры некоторых разных кодовых точек.Ниже приведен фрагмент того, как я генерировал эти таблицы.

...
UTFCRUDResultStrings.add('INPUT: '+#9#9+ DATA +#9#9+ 'GetFirstCodePointSize = ' +intToStr(GetFirstCodepointSize(DATA))
+#9#9+ 'Length =' + intToStr(length(DATA)));
...

Первый набор: это имеет смысл для меня, каждый размер кодовой точки удваивается, но это один символ каждый, и Delphi дает мне длину всего 1, идеально.

INPUT:      ď       GetFirstCodePointSize = 2       Length =1
INPUT:      ơ       GetFirstCodePointSize = 2       Length =1
INPUT:      ǥ       GetFirstCodePointSize = 2       Length =1

Второй сет: мне изначально кажется, что длины и кодовые точки меняются местами? Я предполагаю, что причина этого в том, что символы + суррогаты обрабатываются индивидуально, следовательно, первый размер кодовой точки для «H», который равен 1, но длина возвращает длину «H» плюс «^».

INPUT:      Ĥ      GetFirstCodePointSize = 1       Length =2
INPUT:      à̲     GetFirstCodePointSize = 1       Length =3
INPUT:      V̂      GetFirstCodePointSize = 1       Length =2
INPUT:      e       GetFirstCodePointSize = 1       Length =1

Некоторые дополнительные тесты ...

INPUT:      ¼       GetFirstCodePointSize = 2       Length =1
INPUT:      ₧       GetFirstCodePointSize = 3       Length =1
INPUT:            GetFirstCodePointSize = 4       Length =2
INPUT:      ß       GetFirstCodePointSize = 2       Length =1
INPUT:            GetFirstCodePointSize = 4       Length =2

Есть ли в Delphi надежный способ определить, гдеэлемент в строке Unicode начинается и заканчивается?

Я знаю, что моя терминология с использованием элемента word может быть отключена, но я не думаю, что кодовая точка и символ тоже правильные, особенно учитывая, что один элемент может иметь размер кодовой точки 3, но иметь длину только один.

Ответы на вопрос(1)

Ваш ответ на вопрос