delphi vs c# post returns different strings - utf problem?
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Đ...
#$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(S开发者_JS百科erverURL, aParam);
end;
Result := res;
req.Free;
end;
-edit- I'm using delphi 2010
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;
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)?
精彩评论