2

Delphi 7 で SuperObject を使用してこの文字列を解析しようとしています。

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;

しかし、メモの結果は次のようになります。

"???????????????????????????????????????????????????? ???}」

私は何を間違っていますか?

4

2 に答える 2

3

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}. したがって、古いバージョンのコードを使用している可能性があるのではないかと思います。リポジトリから最新バージョンをプルします。

于 2013-09-20T11:51:38.863 に答える
2

私は Delphi 7 で SuperObjects1.2.4 を使用して同じ問題を抱えていました。多くの人が言ったように、解決策は最新バージョンを入手することです。したがって、リポジトリから最新の SuperObjects バージョンを取得するには、次のようにします。 1. git をインストールします ( http://git-scm.com/ ) 2. いくつかのフォルダーを右クリックし、[Git bash] を選択して、次を貼り付けます。

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

終わり!

于 2014-03-04T04:05:41.520 に答える