4

我发布了两种形式 - 一种在 c# 中,另一种在 delphi 中。但结果字符串似乎有所不同:

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

和 sice 都是压缩流我在尝试解压缩时遇到错误...... C# 是“正确的” - 即。提取物。我不是 delphi 专家 - 我只需要将一些代码从 c# 转换为 delphi。

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;

-edit-我使用的是delphi 2010

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+),您应该注意用于存储信息的本机 sting 类型不是 UTF8,而是 16 位基 (USC2)。Hance,数据可能在某个地方从 UTF8 转换为 USC2,并增强了您的二进制数据的转换。

一个问题:为什么将二进制数据作为 UTF8 而不是八位字节(例如原始字节)发送?

于 2010-06-15T13:30:32.077 回答