2 Stimmen

Lesen von Webseiten / Unicode

Ich habe diese Funktion in Delphi 2009 /2010

Es gibt Müll zurück, jetzt, wenn ich die char, pchar Typen zu Ansichar, Pansichar ändere, gibt es den Text zurück, aber alle fremden Unicode-Text ist Müll. es fahren mich Banane Ich habe jetzt seit 2 Tagen alles Mögliche versucht Ich dachte, ich verstehe diesen Unicode-Mist, aber das tue ich wohl nicht. Bitte um Hilfe danke Philippe Watel

function GetInetFileAsString(const fileURL: string): string;
const
  C_BufferSize = 1024;
var
  sAppName: string;
  hSession,
    hURL: HInternet;

  Buffer: array[0..C_BufferSize] of Char;
  BufferLen: DWORD;

  strPageContent: string;
  strTemp: string;

begin
  Result := '';
  sAppName := ExtractFileName(Application.ExeName);
  hSession := InternetOpen(PChar(sAppName), INTERNET_OPEN_TYPE_PRECONFIG, nil,
    nil, 0);
  try
    hURL := InternetOpenURL(hSession, PChar(fileURL), nil, 0, 0, 0);
    try
      strPageContent := '';
      repeat
        InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen);
        SetString(strTemp, PChar(@buffer), BufferLen div SizeOf(Char));
        strPageContent := strPageContent + strTemp;
      until BufferLen = 0;
      Result := strPageContent;
    finally
      InternetCloseHandle(hURL)
    end
  finally
    InternetCloseHandle(hSession)
  end
end;

4voto

Remy Lebeau Punkte 498719

Beginnend mit Delphi 2009, String ist ein Alias für UnicodeString die UTF-16-Daten enthält. Eine HTML-Seite hingegen wird in der Regel mit einer Multi-Byte-AnSI-Kodierung kodiert (heutzutage meist UTF-8, aber nicht immer). Ihr derzeitiger Code funktioniert nur, wenn das HTML als UTF-16 kodiert ist, was sehr selten der Fall ist. Sie sollten die rohen HTML-Bytes nicht in eine UnicodeString direkt. Sie müssen zunächst die gesamten Daten in eine TBytes , RawByteString , TMemoryStream oder einen anderen geeigneten Byte-Container Ihrer Wahl, und führen Sie anschließend eine Ansi->Unicode-Konvertierung auf der Grundlage des Zeichensatzes durch, der in der HTTP-Antwortkopfzeile "Content-Type" angegeben ist. Sie können die Accept-charset Request-Header, um dem Server mitzuteilen, in welchem Zeichensatz die Daten gesendet werden sollen, und wenn der Server nicht in der Lage ist, diesen Zeichensatz zu verwenden, sollte er eine 406 Not Acceptable Antwort (obwohl es trotzdem eine erfolgreiche Antwort in einem inakzeptablen Zeichensatz senden KANN, wenn es sich entscheidet, Ihren Anfrage-Header zu ignorieren, also sollten Sie das berücksichtigen).

Versuchen Sie so etwas:

function GetInetFileAsString(const fileURL: string): string;
const
  C_BufferSize = 1024;
var
  sAppName: string;
  hSession, hURL: HInternet;
  Buffer: array of Byte;
  BufferLen: DWORD;
  strHeader: String;
  strPageContent: TStringStream;
begin
  Result := '';
  SetLength(Buffer, C_BufferSize);
  sAppName := ExtractFileName(Application.ExeName);
  hSession := InternetOpen(PChar(sAppName), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  try
    strHeader := 'Accept-Charset: utf-8'#13#10;
    hURL := InternetOpenURL(hSession, PChar(fileURL), PChar(strHeader), Length(strHeader), 0, 0);
    try
      strPageContent := TStringStream.Create('', TEncoding.UTF8);
      try
        repeat
          if not InternetReadFile(hURL, PByte(Buffer), Length(Buffer), BufferLen) then
            Exit;
          if BufferLen = 0 then
            Break;
          strPageContent.WriteBuffer(PByte(Buffer)^, BufferLen);
        until False;
        Result := strPageContent.DataString;
        // or, use HttpQueryInfo(HTTP_QUERY_CONTENT_TYPE) to get
        // the Content-Type header, parse out its "charset" attribute,
        // and convert strPageContent.Memory to UTF-16 accordingly...
      finally
        strPageContent.Free;
      end;
    finally
      InternetCloseHandle(hURL);
    end
  finally
    InternetCloseHandle(hSession);
  end;
end;

0voto

Lloyd Punkte 28594

Mein erster Gedanke ist, den korrekten AcceptEncoding/CharSet-Header in die Anfrage einzufügen:

z.B.:

Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X