4

2つのフォームを投稿しています。1つはc#で、もう1つはdelphiです。しかし、結果の文字列は異なるようです。

c#は返します:¤@@1@@@@1@@@@1@@xśm˱Â0Đ...
delphiは返します:#$1E'@@1@@@@1@@@@1@@x'#$009C...

とsiceは両方とも圧縮されたストリームです。解凍しようとするとエラーが発生します... C#は「正しい」です-つまり。抽出します。私はデルファイの専門家ではありません。コードの一部をc#からデルファイに変換する必要があります。

c#コード:

string GetData(Hashtable aParam, string ServerURL)
{
    string Result = "";

    WebRequest Request = HttpWebRequest.Create(ServerURL);
    Request.Method = "POST";
    Request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";

    UTF8Encoding encUTF8 = new System.Text.UTF8Encoding(false);

    StreamWriter writer = new StreamWriter(Request.GetRequestStream(), encUTF8);
    foreach (DictionaryEntry element in aParam)
    {
        writer.Write(element.Key + "=" + element.Value + "&");
    }
    writer.Close();
    writer.Dispose();

    WebResponse Response = Request.GetResponse();
    StreamReader Reader = new StreamReader(Response.GetResponseStream(), System.Text.Encoding.Default);

    Result = Reader.ReadToEnd();
    Reader.Close();
    Response.Close();

    Reader.Dispose();

    return Result;
}

デルファイコード:

function GetData(aParam:TStringList; ServerURL:string):string;
var
  req: TIdHTTP;
  res: string;
begin
    req := TIdHTTP.Create();

    with req do
    begin
      Request.ContentType := 'application/x-www-form-urlencoded; charset=UTF-8';
      Request.Method := 'POST';
      Request.CharSet := 'utf-8';
      Request.AcceptCharSet := 'utf-8';
      res := Post(ServerURL, aParam);

    end;

    Result := res;
    req.Free;
end;

-編集-私はdelphi2010を使用しています

4

2 に答える 2

6

post メソッドをストリームを使用するメソッドに変更すると、問題が解決したことがわかりました。いくつかのサイトで見つけたように、「TIdHTTP.Post() はまだ TStringList からの Unicode のポストをサポートしていません。最初に Unicode を別の TStream に保存してから、代わりにポストする必要があります。」

function GetData(aParam:TStringList; aurl:string):string;
var
  req: TIdHTTP;
  i: integer;
  vars: string;
  reqStream, responseStream :TStringStream;
begin

    vars := '';

    for i := 0 to aParam.Count - 1 do
    begin
      vars := vars + aParam.Names[i] + '=' + aparam.ValueFromIndex[i] + '&';
    end;

    reqStream := TStringStream.Create(vars);
    responseStream := TStringStream.Create;

    req := TIdHTTP.Create();
    with req do
    begin
      Request.URL := aurl;
      Request.ContentType := 'application/x-www-form-urlencoded';
      Request.Method := 'POST';
      Request.CharSet := 'UTF-8';
      Request.AcceptCharSet := 'UTF-8';
    end;

    req.Post(aurl, reqStream,responseStream);

    Result := responseStream.DataString;

    reqStream.Free;
    responseStream.Free;
    req.Free;
end;
于 2010-06-15T13:27:19.713 に答える
1

Delphi 2010 (2009+) を使用している場合は、情報を格納するために使用したネイティブ文字列型が UTF8 ではなく 16 ビット ベース (USC2) であることに注意してください。おそらくどこかでデータが UTF8 から USC2 に変換され、バイナリ データが変換されます。

1 つの質問: バイナリ データをオクテット (生バイトなど) ではなく UTF8 として送信するのはなぜですか?

于 2010-06-15T13:30:32.077 に答える