Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Использование XSuperObject для сериалиpации, десериализации классов Delphi / 8 сообщений из 8, страница 1 из 1
24.11.2018, 11:53
    #39737865
k.besedin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование XSuperObject для сериалиpации, десериализации классов Delphi
Доброго дня мудрецы!
Использую класс XSuperObject для перевода класса в json строку и обратно.
Все бы ничего, но при вызове метода AsJSON с кириллицей json строка становится такой:
'"Поиск по фамилии, имени (отчеству"' к примеру.

Как сделать так, чтобы она отображалась в нормальной кодировке с кириллицей и нормально работала при вызове AssignFromJSON с этой кодировкой?
...
Рейтинг: 0 / 0
24.11.2018, 13:27
    #39737898
JayDi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование XSuperObject для сериалиpации, десериализации классов Delphi
k.besedin,

Посмотреть в доках/настройках, зачем там простые юникодные символы экранирует. Возможно, компонент думает, что в анси, не utf хотят выгрузить. Гугл подсказывает, что результат можно вручную преобразовывать:
https://bitbucket.org/vkrapotkin/unescapejson/src/934dc8bdc66106816939c81a1ab4b91d65287008/UUnescapeJSON.pas?at=master&fileviewer=file-view-default

Но это так себе решение, на черный день.
...
Рейтинг: 0 / 0
24.11.2018, 14:13
    #39737922
asutp2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование XSuperObject для сериалиpации, десериализации классов Delphi
k.besedinДоброго дня мудрецы!
Использую класс XSuperObject для перевода класса в json строку и обратно.
Все бы ничего, но при вызове метода AsJSON с кириллицей json строка становится такой:
'"Поиск по фамилии, имени (отчеству"' к примеру.

Как сделать так, чтобы она отображалась в нормальной кодировке с кириллицей и нормально работала при вызове AssignFromJSON с этой кодировкой?Стандартный System.Json прекрасно справляется с этой ситуацией, что еще раз подтверждает ущербность XSuperObject))))
...
Рейтинг: 0 / 0
25.11.2018, 04:08
    #39738108
k.besedin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование XSuperObject для сериалиpации, десериализации классов Delphi
Решил проблему таким образом:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
function Convert(const InText: string): string;
var
  i, op: Integer;
  c: Char;
  t, n: string;
begin
  i := 1;
  op := 1;
  while PosEx('\u', InText, i) <> 0 do
  begin
    i := PosEx('\u', InText, i);
    t := t + Copy(InText, op, i - op);
    Inc(i, 2);
    n := Copy(InText, i, 4);
    op := i + 4;
    c := Char(StrToInt('$' + n));
    t := t + WideString(c);
  end;
  t := t + Copy(InText, op, Length(InText));
  Result := t;
end;
...
Рейтинг: 0 / 0
25.11.2018, 04:25
    #39738111
Гирлионайльдо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование XSuperObject для сериалиpации, десериализации классов Delphi
k.besedin,

Данная функция называется - "привет из будущего".
...
Рейтинг: 0 / 0
25.11.2018, 04:48
    #39738112
Фэйтл Эра
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование XSuperObject для сериалиpации, десериализации классов Delphi
k.besedinДоброго дня мудрецы!
Использую класс XSuperObject для перевода класса в json строку и обратно.
Все бы ничего, но при вызове метода AsJSON с кириллицей json строка становится такой:
'"Поиск по фамилии, имени (отчеству"' к примеру.

Как сделать так, чтобы она отображалась в нормальной кодировке с кириллицей и нормально работала при вызове AssignFromJSON с этой кодировкой?

Сие поведение скорее всего правильно, ибо результат пригоден для использования в парсерах, принимающих хоть юникодные, хоть ANSIшные строки. Да и какая нафик разница, как оно там в файле закодировано?
Отчего так
Код: pascal
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.
  function ChrToUTF16(const ChrCode: Integer): String; inline;
  begin
     Result := '\u' +
               HexMap[ChrCode shr 12] +
               HexMap[(ChrCode shr 8) and 15] +
               HexMap[(ChrCode shr 4) and 15] +
               HexMap[ChrCode and 15];
  end;

  function StrToUTF16(const Str: String): String;
  var
    Tmp: PWideChar;
  begin
    if Str = #0 then Exit(ChrToUtf16(0));
    Result := '';
    if Str = '' then
       Exit
    else
       Tmp := PWideChar(Pointer(Str));
    while Tmp^ <> #0 do
    begin
      case Tmp^ of
        #1..#31: case Tmp^ of
                  #8 : Result := Result + '\b';
                  #9 : Result := Result + '\t';
                  #10: Result := Result + '\n';
                  //#11: Result := Result + '\v';
                  #12: Result := Result + '\f';
                  #13: Result := Result + '\r';
               else
                  Result := Result + ChrtoUTF16(Ord(Tmp^))
               end;
        #34{"}: Result := Result + '\"';
        #92{\}: Result := Result + '\\';
        #127..#65535: Result := Result + ChrtoUTF16(Ord(Tmp^));
      else
        Result := Result + Tmp^;
      end;
      Inc(Tmp);
    end;
  end;



А если тебе все же хочется "красиво", то просто закомментируй эту строчку:
Код: pascal
1.
        #127..#65535: Result := Result + ChrtoUTF16(Ord(Tmp^));


Или измени диапазон #127..#65535 так, чтобы кириллица в него не попадала.
...
Рейтинг: 0 / 0
25.11.2018, 04:55
    #39738114
Фэйтл Эра
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование XSuperObject для сериалиpации, десериализации классов Delphi
k.besedinРешил проблему таким образом:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
function Convert(const InText: string): string;
var
  i, op: Integer;
  c: Char;
  t, n: string;
begin
  i := 1;
  op := 1;
  while PosEx('\u', InText, i) <> 0 do
  begin
    i := PosEx('\u', InText, i);
    t := t + Copy(InText, op, i - op);
    Inc(i, 2);
    n := Copy(InText, i, 4);
    op := i + 4;
    c := Char(StrToInt('$' + n));
    t := t + WideString(c);
  end;
  t := t + Copy(InText, op, Length(InText));
  Result := t;
end;


Товарищ, а если во входном потоке появятся управляющие символы (те, что в С принято обозначать '\b', '\t', '\n', '\v', '\f', '\r'), или символы 1 (одинарная кавычка), " (двойная кавычка), / (слэш), \ (обратный слэш), символ с кодом 0 и т.д.?
...
Рейтинг: 0 / 0
25.11.2018, 14:37
    #39738176
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование XSuperObject для сериалиpации, десериализации классов Delphi
k.besedinРешил проблему таким образом:

Код: pascal
1.
2.
3.
while PosEx('\u', InText, i) <> 0 do
  begin
    i := PosEx('\u', InText, i);


...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Использование XSuperObject для сериалиpации, десериализации классов Delphi / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]