3

使用 Indy THTTP,我获得了一个响应Content-Type: text/html; charset=UTF-8并将其存储在TStringStream. 如果我然后使用ReponseStream.ReadString(ResponseStream.Size),结果String将无法正确显示。我敢打赌这是因为 Windows 使用 UTF-16。

我尝试了一些东西,TEncoding.UTF8结果TEncoding.Convert只会更糟(开始看起来像中国人)。

这是当前代码:

var
  LHTTP: TIdHTTP;
  LResponseStream: TStringStream;
  LResponse: String;
begin
  LResponseStream := TStringStream.Create();
  try
    LHTTP := TIdHTTP.Create(nil);
    try
      LHTTP.Get('url', LResponseStream); // Returns 'hęllo'
    finally
      LHTTP.Free;
    end;
    LResponseStream.Position := 0;
    LResponse := LResponseStream.ReadString(LResponseStream.Size);
    ShowMessage(LResponse); // Make me pretty
  finally
    LResponseStream.Free;
  end;
end;

我应该改变什么才能获得常规的 Delphi String...?

4

2 回答 2

6

TIdHTTP 有一个 Get() 的重载版本,它返回一个字符串。它将为您将 UTF-8 解码为 UTF-16:

LResponse := LHTTP.Get('url');
于 2013-09-22T16:35:48.503 回答
4

如果您尝试下载的内容被编码为 UTF-8 字符集,您可以简单地强制 TStringStream 以这种方式在内部将该数据重新编码为 UTF-8:

LResponseStream := TStringStream.Create('', TEncoding.UTF8);
于 2013-09-22T16:11:12.873 回答