Пишу небольшой сервер на REST технологии. Столкнулся с тем, что ответы нужно отправлять на русском языке, а сервер такие ответы превращает в
1 2 3 4 |
{"result":["703,\u0422\u0430\u043A\u043E\u0439 \u0442\u043E\u043A\u0435\u043D \u0443\u0436\u0435 \u0434\u043E \u0431\u0430\u0432\u043B\u0435\u043D"]} |
Задача простая, но не простая. Перепробовал много способов с разных сайтов, итого, вот мой рабочий вариант. Решение опирается на пост одного замечательного программиста, который написал функцию декодирования, которая действительно работает.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
unit uDecodeServerAnswer; interface uses SysUtils, Classes, System.json; type TDecodeServerAnswer = class(TDataModule) function DecodeHTML(AHTML:string):string; function ParseServerAnswer(AJsonString:string):string; end; implementation {$R *.dfm} 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; { TDecodeServerAnswer } function TDecodeServerAnswer.DecodeHTML(AHTML: string): string; var sl:TStringList; i:Integer; begin sl:=TStringList.Create; try sl.Text:=utf16decode(AHTML); for i := 0 to SL.Count-1 do Result:=Result+SL[i]; finally sl.Free; end; end; function TDecodeServerAnswer.ParseServerAnswer(AJsonString: string): string; var originJo: TJSONObject; joItems: TJSONArray; i: integer; begin originJo := TJSONObject.ParseJSONValue(AJsonString) as TJSONObject; try joItems:=OriginalJSONObject.GetValue('result') as TJSONArray; if joItems.Count>0 then Result:=((joItems.Items[0] as TJSONValue).Value); finally originJo.Free(); end; end; end. |
Тестируем…