Конвертация Unicode-ответа JSON в Delphi без функции HTMLDecode

#1 2021.11.19 14:13:35

0

Функцией конвертации unicode-кодировки в Delphi.

\u0412\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u043b\u0438 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0434\u0430\u0432\u0446\u043e\u0432 \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u043a \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0441\u043d\u043e\u0432\u0430 \u0447\u0435\u0440\u0435\u0437 \u0447\u0430\u0441

В принципе, декодирование данной строки решаемо и штатными средствами Delphi XE2, а точнее функцией HTMLDecode:

function HTMLDecode(const AStr: String): String;

Во-первых, данной функции нет в Delphi 2007. Во вторых данная функция не совсем корректно декодирует строки, большая проблема возникает с пробелами.


Создана функция конвертации Unicode-кодировки, взята за основу функцию HTMLdecode.

function utf16decode(const encode:string):string;
var
presult,psource:PChar;
s:string;
buf,code:Integer;
begin
try
SetLength(result, length(encode));
presult:=pchar(result);
psource:=pchar(encode);

while psource^<>#0 do
begin
if (psource^='\') then
begin
inc(psource);
if psource^='u' then
begin
psource^:='x';
SetString(s,psource,5);
Val(s,buf,code);
if buf>=$100 then
begin
s:=WideChar(buf);
presult^:=s[1];
end
else
presult^:=chr(buf);
Inc(psource,5);
end
else
presult^:='\';
end
else
begin
presult^:=psource^;
Inc(psource);
end;

Inc(presult);
end;
SetLength(result, presult - pchar(Result));
except
result:='error';
end;
end;


Вызывать и использовать данную функцию нужно следующим образом:

result:=utf16decode(source);