views:

222

answers:

2

I'm posting two forms - one in c# and one in delphi. But the result string seems to be different:

c# returns: ¤@@1@@@@1@@@@1@@xśm˱Â0Đ...
delphi returns: #$1E'@@1@@@@1@@@@1@@x'#$009C...

and sice both are compressed streams I'm getting errors while trying to decompress it... The C# is 'correct' - ie. extracts. I'm not an expert on delphi - I just need to convert some piece of code from c# to delphi.

c# code:

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;
}

delphi code:

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;

-edit- I'm using delphi 2010

+5  A: 

It turns out that changing the post method to the one that uses streams solved the issue. As I've found on some site: "TIdHTTP.Post() does not support posting Unicode from a TStringList yet. You will have to save the Unicode to a separate TStream first and then post that instead."

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;
argh
+1  A: 

If you use Delphi 2010 (2009+) you should niote that the native sting type that you used to store the information is not UTF8 but 16bit bases (USC2). Hance, somewhere probably the data is converted from UTF8 to USC2 and ehance your binary data is converted.

One question: why send binary data as UTF8 and not as octets (eg raw bytes)?

Ritsaert Hornstra
I'm just translating the code I was given - don't try to make sense of it (I gave up).
argh