Почему я получаю множество вопросительных знаков при анализе строки с помощью 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/
Готово!