delphi vs c # post возвращает разные строки - проблема с utf? - PullRequest
4 голосов
/ 15 июня 2010

Я публикую две формы - одну на 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;
}

код 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- Я пользуюсь delphi 2010

Ответы [ 2 ]

6 голосов
/ 15 июня 2010

Оказывается, что изменение метода post на метод, использующий потоки, решил проблему.Как я нашел на каком-то сайте: "TIdHTTP.Post () пока не поддерживает отправку Unicode из TStringList. Сначала вам нужно сохранить 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;
1 голос
/ 15 июня 2010

Если вы используете Delphi 2010 (2009+), вам следует отметить, что собственный тип sting, который вы использовали для хранения информации, - это не UTF8, а 16-битные базы (USC2). Скорее всего, где-то, вероятно, данные преобразуются из UTF8 в USC2, и, как следствие, ваши двоичные данные преобразуются.

Один вопрос: зачем отправлять двоичные данные как UTF8, а не как октеты (например, необработанные байты)?

...