2010-06-15 27 views
4

Je poste deux formulaires - un en C# et un en Delphi. Mais la chaîne de résultat semble être différent:delphi vs C# post renvoie des chaînes différentes - problème utf?

C# retours: ¤@@[email protected]@@@[email protected]@@@[email protected]@xśm˱Â0Đ...
retours delphi: #$1E'@@[email protected]@@@[email protected]@@@[email protected]@x'#$009C...

et je reçois des erreurs tout en essayant de le décompresser ... SICE les deux sont des flux comprimé Le C# est 'correct' - ie. extraits. Je ne suis pas un expert sur Delphi - J'ai juste besoin de convertir un morceau de code de C# à 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:

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- J'utilise delphi 2010

+0

Quelle version est correcte et peut être décompressée? Il pourrait être bon d'utiliser un outil tel que Fiddler2 pour surveiller le trafic HTTP qui se passe réellement. Cela vous permettrait de voir quelle est la différence dans la demande. –

+0

la version C# est correcte, je viens de penser à fiddler ... – argh

+1

Je pense que j'ai trouvé la raison: 'TIdHTTP.Post() ne supporte pas de publier Unicode à partir d'un TStringList pour le moment. Vous devrez d'abord enregistrer l'Unicode dans un autre TStream, puis le publier à la place. » – argh

Répondre

6

Il se avère que la modification de la méthode post à celui qui utilise des flux a résolu le problème. Comme je l'ai trouvé sur certains sites: "TIdHTTP.Post() ne supporte pas encore la publication d'Unicode à partir d'un TStringList.Vous devrez d'abord enregistrer l'Unicode dans un TStream séparé, puis le publier à la place."

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

Si vous utilisez Delphi 2010 (2009+), vous devriez niote que le type de piqûre native que vous avez utilisé pour stocker les informations ne sont pas des bases UTF8 mais 16bit (USC2). Hance, quelque part, les données sont probablement converties de UTF8 à USC2 et même si vos données binaires sont converties. Une question: pourquoi envoyer des données binaires comme UTF8 et non comme des octets (par exemple des octets bruts)?

+0

Je ne fais que traduire le code On m'a donné - n'essayez pas de donner un sens à cela (j'ai abandonné). – argh