Индексный символ вместо байта в строке Delphi - PullRequest
0 голосов
/ 24 октября 2018

Я читаю документ по индексу в строку Delphi, как показано ниже:

http://docwiki.embarcadero.com/RADStudio/Tokyo/en/String_Types_(Delphi)

Один оператор сказал:

Вы можете проиндексировать строкупеременная так же, как вы бы массив.Если S - не строковая переменная, отличная от UnicodeString, и i - целочисленное выражение, то S [i] представляет i-й байт в S, который может не быть i-м символом или целым символом для многобайтовой символьной строки (MBCS).Аналогично, индексирование переменной UnicodeString приводит к тому, что элемент может не быть целым символом.Если строка содержит символы в базовой многоязычной плоскости (BMP), все символы имеют размер 2 байта, поэтому при индексации строки получаются символы.Однако, если некоторые символы отсутствуют в BMP, индексированный элемент может быть суррогатной парой, а не целым символом.

Если я правильно понимаю, S[i] является индексом для i -байт строки.Если S является UnicodeString, то S[1] является первым байтом, S[2] является вторым байтом первого символа, S[3] является первым байтом второго символа и т. Д. Если это тактогда как мне индексировать символ вместо байта внутри строки?Мне нужно индексировать символы, а не байты.

1 Ответ

0 голосов
/ 24 октября 2018

В Delphi S[i] - это char aka widechar.Но это не «символ» Unicode, это кодированное значение UTF-16 в 16 битах (2 байта).В предыдущем веке, т.е. до 1996 года, Unicode был 16-битным, но это уже не так!Пожалуйста, внимательно прочитайте FAQ по Unicode .

. Вам может понадобиться несколько widechar, чтобы иметь целую кодовую точку Unicode = более или менее то, что мы обычно называем «символом».И даже это может быть неправильно, если используются диакритические знаки.

UTF-16 использует одну 16-битную кодовую единицу для кодирования наиболее распространенных 63K-символов и пару 16-битных кодовых единиц, называемых суррогатами, для кодирования 1M менее часто используемых символов вUnicode.

Изначально Unicode разрабатывался как чисто 16-битная кодировка, предназначенная для представления всех современных сценариев.(Древние сценарии должны были быть представлены с использованием символов личного пользования.)

Со временем, особенно после добавления более 14 500 составных символов для совместимости с устаревшими наборами, стало ясно, что 16-разрядных не достаточно длясообщество пользователей.Из этого возникло UTF-16.

см. UTF-16 FAQ

Для правильного декодирования кодовых точек Unicode в Delphi, см. Обнаружение и получениекодовые точки и суррогаты строки Delphi (ссылка @LURD в комментариях)

...