Обнаружение и получение кодовых точек и суррогатов из строки 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, но иметь длину только один.