Код: Выделить всё
// переворачивает строку, записанную в UTF-8 в обратном направлении
function ReverseStringUtf8(const S:string):string;
var
PrimeChar,LastChar:integer;
B:byte;
begin
PrimeChar:=1;
LastChar:=Length(S);
SetLength(Result,LastChar);
while LastChar>0 do begin
B:=ord(S[PrimeChar]);
if B and $F7=$F0 then begin
// четырёхбайтный символ
Result[LastChar-3]:=S[PrimeChar+0];
Result[LastChar-2]:=S[PrimeChar+1];
Result[LastChar-1]:=S[PrimeChar+2];
Result[LastChar-0]:=S[PrimeChar+3];
Inc(PrimeChar,4);
Dec(LastChar,4);
end else if B and $F0=$E0 then begin
// трёхбайтовый символ
Result[LastChar-2]:=S[PrimeChar+0];
Result[LastChar-1]:=S[PrimeChar+1];
Result[LastChar-0]:=S[PrimeChar+2];
Inc(PrimeChar,3);
Dec(LastChar,3);
end else if B and $E0=$C0 then begin
// двухбайтовый символ
Result[LastChar-1]:=S[PrimeChar+0];
Result[LastChar-0]:=S[PrimeChar+1];
Inc(PrimeChar,2);
Dec(LastChar,2);
end else begin
// однобайтный символ
Result[LastChar]:=S[PrimeChar];
Inc(PrimeChar);
Dec(LastChar);
end;
end;
end;