Detectar y recuperar puntos de código y sustitutos de una cadena Delphi

Estoy tratando de comprender mejor los pares sustitutos y la implementación de Unicode en Delphi.

Si llamo a length () en la cadena Unicode S: = 'Ĥà̲V̂e' en Delphi, volveré, 8.

Esto se debe a que las longitudes de los caracteres individuales [Ĥ], [à̲], [V̂] y [e] son 2, 3, 2 y 1 respectivamente. Esto se debe a que Ĥ tiene un sustituto, à̲ tiene dos sustitutos adicionales, V̂ tiene un sustituto y e no tiene sustitutos.

Si quisiera devolver el segundo elemento de la cadena, incluidos todos los sustitutos, [à̲], ¿cómo lo haría? Sé que necesitaría hacer algún tipo de prueba de los bytes individuales. Hice algunas pruebas usando la rutina

function GetFirstCodepointSize(const S: UTF8String): Integer;  

referenciado enesta pregunta SO.

pero obtuve algunos resultados inusuales, por ejemplo, aquí hay algunas longitudes y tamaños de algunos puntos de código diferentes.A continuación se muestra un fragmento de cómo generé estas tablas.

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

Primer conjunto: Esto tiene sentido para mí, cada tamaño de punto de código se duplica, pero estos son un carácter cada uno y Delphi me da la longitud como solo 1, perfecto.

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

Segundo set: ¿Inicialmente me parece que las longitudes y los puntos de código están invertidos? Supongo que la razón de esto es que los caracteres + sustitutos se están tratando individualmente, por lo tanto, el primer tamaño del punto de código es para la 'H', que es 1, pero la longitud devuelve las longitudes de 'H' más '^'.

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

Algunas pruebas adicionales ...

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

¿Hay una manera confiable en Delphi para determinar dónde unelemento en una cadena Unicode comienza y termina?

Sé que mi terminología usando el elemento de palabra puede estar desactivada, pero tampoco creo que el punto de código y el carácter sean correctos, particularmente dado que un elemento puede tener un tamaño de punto de código de 3, pero tener una longitud de solo uno.

Respuestas a la pregunta(1)

Su respuesta a la pregunta