Почему я получаю множество вопросительных знаков при анализе строки с помощью SuperObject?

Я пытаюсь разобрать эту строку с помощью SuperObject в Delphi 7.

procedure TForm1.btn1Click(Sender: TObject);
var
 obj: ISuperObject;
 fw:string;
begin
  fw:= '{"type":"normal","info":{"Name":"frank","Number":"01","Age":"21","registered":"Yes","Support":"Expired"}}';
  obj := TSuperObject.ParseString(PWideChar(fw), false);
  mmo1.lines.Add(obj.AsJSon(true,false));
end;

Но результат в записке выглядит так:

"????????????????????????????????????????????????????}"

Что я делаю неправильно?

2 ответа

Решение

fw - это строка, которая в Delphi 7 имеет 8-битную кодировку ANSI. Таким образом, приведение к PWideChar неверно. Он будет обрабатывать 8-битный текст, как если бы он был в кодировке UTF-16.

Если функция, которую вы вызываете, действительно получает PWideChar, вам нужно сначала преобразовать ее в UTF-16. Например, вот так:

PWideChar(WideString(fw))

Вы также сообщаете об отдельной проблеме, которая возникает в коде суперобъекта. Конкретно эта строка кода:

h := h*129 + ord(k[i]) + $9e370001;

вызывает ошибку переполнения.

Это происходит потому, что в вашем проекте включена опция проверки переполнения (хорошая практика), но код суперобъекта был написан в предположении, что эта опция отключена. Это действительно недостаток суперобъектного кода. Вы можете решить эту проблему, отключив проверку переполнения в коде суперобъекта, добавив {$OVERFLOWCHECKS OFF}, В идеале это было бы отключено очень локально только для кода, который намеренно переполняется. Однако, если вы не полностью понимаете код, это может быть проще {$OVERFLOWCHECKS OFF} в верхней части блока и двигаться дальше.

Теперь я смотрю на самый последний код суперобъекта и прямо в верхней части блока {$OVERFLOWCHECKS OFF}, Поэтому мне интересно, если вы, возможно, используете устаревшую версию кода. Вытащи последнюю версию из репо.

У меня была та же проблема с использованием SuperObjects1.2.4 в Delphi 7. Как говорили многие люди, решение состоит в том, чтобы получить последнюю версию. Итак, чтобы получить последнюю версию SuperObjects из репозитория, выполните следующие действия: 1. Установите git ( http://git-scm.com/) 2. Щелкните правой кнопкой мыши в какой-нибудь папке, выберите "Git bash" и вставьте следующее

git clone https://code.google.com/r/steve-superobject/

Готово!

Другие вопросы по тегам