К примеру, "/ud83c/udf1f/u0410/u043b/u043b..." должно декодироваться в "[ТУТ_КРАСИВЫЙ_ЭМОДЖИ_ДОЛЖЕН_БЫЛ_БЫТЬ]алле...", а на самом деле получаю "��лле...".
Кто что может посоветовать?
Кусок кода из модуля fpc fpJSON:
- Код: Выделить всё
function JSONStringToString(const S: TJSONStringType): TJSONStringType;
Var
I,J,L : Integer;
P : PJSONCharType;
w : String;
begin
I:=1;
J:=1;
L:=Length(S);
Result:='';
P:=PJSONCharType(S);
While (I<=L) do
begin
if (P^='') then
begin
Result:=Result+Copy(S,J,I-J);
Inc(P);
If (P^<>#0) then
begin
Inc(I);
Case AnsiChar(P^) of
'','"','/'
: Result:=Result+P^;
'b' : Result:=Result+#8;
't' : Result:=Result+#9;
'n' : Result:=Result+#10;
'f' : Result:=Result+#12;
'r' : Result:=Result+#13;
'u' : begin
W:=Copy(S,I+1,4);
Inc(I,4);
Inc(P,4);
Result:=Result+WideChar(StrToInt('$'+W)); // Вот тут видимо "собака зарыта"?
end;
end;
end;
J:=I+1;
end;
Inc(I);
Inc(P);
end;
Result:=Result+Copy(S,J,I-J+1);
end;
P.S. Кстати, поймал баг на форуме! Если вставить эмоджи символ в пост на форуме, то вылетает ошибка MySQL:
- Код: Выделить всё
[b]SQL ERROR [ mysql4 ]
Incorrect string value: 'xF0x9Fx8Cx9FxD0xA2...' for column 'post_text' at row 1 [1366]
[/b]
Причем, предварительный просмотр нормально работает, а вот при надажатии отправить, и, видимо, попытке сохранить в базу данных вылетает такая ошибка
Добавлено спустя 15 часов 29 минут 48 секунд:
Мои исследования функции JSONStringToString (fpJSON) привели меня к непонятным для меня результатам....
- Код: Выделить всё
procedure TForm1.Button3Click(Sender: TObject);
var
S, S1: TJSONStringType;
begin
S:='';
S+=WideChar(StrToInt('$d83c'));
S+=WideChar(StrToInt('$df1f'));
S+=WideChar(StrToInt('$0410'));
S1:='';
S1+=WideChar(StrToInt('$d83c'))+WideChar(StrToInt('$df1f'))+WideChar(StrToInt('$0410'));
EdtOutput.Text:='S: '+S+', S1: '+S1;
end;
Вот это на выходе
То есть конкантенация WideChar в одной строчке кода и последовательная конкантенация по строчке дают разные результате... Кто нибудь может объяснить?