Во время чтения очередной статьи про собеседования на программиста, столкнулся с такой простой на первый взгляд задачей: претенденту предложили написать функцию, которая "переворачивает" строку. Аналог ReverseString, но свой. Ответ, который дал претендент, не устроил собеседователя. Оказалось, что он ждал уточняющего вопроса: в какой кодировке, дескать, задана строка, а ответ должен был быть принят для кодировки UTF-8. С задачей претендент, похоже, не справился, а я решил написать свой вариант, поскольку на первой странице гугля такового не обнаружилось. Предлагаю на суд общественности:
- Код: Выделить всё
// переворачивает строку, записанную в 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;