IgorPI
@IgorPI

Как привести текст к нормальной кодировке в delphi?

Коллеги, уже не смешно.
3 дня меня гложет вопрос.

Использую класс THttpClient.
Установил правильные заголовки.
AHeaders[0].Create('Content-Type', 'text/html; charset=UTF-8');
   AHeaders[1].Create('Accept', 'application/json, text/plain; q=0.9, text/html;q=0.8');
   AHeaders[2].Create('Accept-Language', 'ru-RU,ru');
   AHeaders[3].Create('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36');
   AHeaders[4].Create('Accept-Charset', 'utf-8; q=0.5');
   AHeaders[5].Create('Accept-Encoding', 'gzip, deflate, br');


В респонс прилетает
5d2f1845f2058611736100.png

вот полный код:
function TMKCardLoader.LoadContent(const url: string): string;
const
 ERROR_LIMIT = 5;
 EXCEPT_SLEEP = 10000;
var
  http: THttpClient;
  uri: TURI;
  ResponseStream: TStringStream;
  Sl: TStringList;
  Response: IHTTPResponse;

  ErrorCounter: integer;
  IsExcept: boolean;

  AHeaders: TNetHeaders;
label
  Reload;
begin
 try
   Result := '';
   uri := TURI.Create(FBaseUrl);
   uri.Path := url;
   ResponseStream := TStringStream.Create('', TEncoding.Default);
   http := THTTPClient.Create;
   http.ConnectionTimeout := 12000;
   http.AllowCookies := true;
   http.CookieManager := TCookieManager.Create;
   http.HandleRedirects := true;

   SetLength(AHeaders, 6);

   AHeaders[0].Create('Content-Type', 'text/html; charset=UTF-8');
   AHeaders[1].Create('Accept', 'application/json, text/plain; q=0.9, text/html;q=0.8');
   AHeaders[2].Create('Accept-Language', 'ru-RU,ru');
   AHeaders[3].Create('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36');
   AHeaders[4].Create('Accept-Charset', 'utf-8; q=0.5');
   AHeaders[5].Create('Accept-Encoding', 'gzip, deflate, br');

   ErrorCounter := 0;
   Reload:
   IsExcept:= false;
   try
     Response := http.Get(uri.ToString, ResponseStream, AHeaders);
     result := ResponseStream.DataString;
   except
      on E: Exception do
      begin
        OutputDebugString(Pwidechar(E.Message));
        Inc(ErrorCounter);
        IsExcept := true;
      end;
    end;

    if IsExcept then
      if ErrorCounter >= ERROR_LIMIT then
        exit
      else
      begin
        Sleep(EXCEPT_SLEEP);
        goto Reload;
      end;
 finally
   ResponseStream.Free;
   http.Free;
 end;
end;


Если вы обратили внимание на
ResponseStream := TStringStream.Create('', TEncoding.Default);


Здесь я указывал utf-8
И да, текст нормально читается, но не стабильно работает, даже очень не стабильно.
try
     Response := http.Get(uri.ToString, ResponseStream, AHeaders);
     result := ResponseStream.DataString; // тут всё разрушается если в TStringStream.Create('', TEncoding.utf8);
   except
      on E: Exception do
      begin
        OutputDebugString(Pwidechar(E.Message));
        Inc(ErrorCounter);
        IsExcept := true;
      end;
    end;


Исключение 'No mapping for the Unicode character exists in the target multi-byte code page'

Резюме:

Исключение выбрасывает если TStringStream.Create('', TEncoding.utf8);
Если TStringStream.Create('', TEncoding.Default); // нет исключения, но крокозябры
  • Вопрос задан
  • 1444 просмотра
Решения вопроса 1
IgorPI
@IgorPI Автор вопроса
Коллеги!

UTF8ToString и есть решение!

Спасибо!
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы