Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Кодировки из чего-то во что-то


Автор: Zlo 21.8.2011, 02:31
Столкнулся с проблемой в D2009, при загрузке странички с помощью indy IdHTTP  в Memo получается вот такая петрушка с русскими символами.

кусочек кода странички:
Код

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<script type="text/javascript" src="/al_loader.php?act=nav&v=4648"></script>

<link rel="shortcut icon" href="/images/faviconnew.ico" />

<meta http-equiv="content-type" content="text/html; charset=windows-1251" />
<meta name="description" content="<b>ÂÊîíòàêòå</b> – óíèâåðñàëüíîå ñðåäñòâî êîììóíèêàöèè è ïîèñêà ëþäåé,<br>êîòîðûì åæåäíåâíî ïîëüçóþòñÿ äåñÿòêè ìèëëèîíîâ ÷åëîâåê. Ìû õîòèì, ÷òîáû äðóçüÿ, îäíîêóðñíèêè, îäíîêëàññíèêè, ñîñåäè è êîëëåãè âñåãäà îñòàâàëèñü â êîíòàêòå." />

<title>Äîáðî ïîæàëîâàòü</title>



Путем экспериментов мне все таки удалось сделать сделать из этого русский текст, далее немного сути:
Код символа "Â" = 194, в русском это буква "В" и ее код в моем проекте показывает как 1042
1042-194=848, именно эта магическая цифра отделяет меня от нормального отображения русских букв.
пришлось перебирать все символы что бы текст стал читаемым, прибавляя к символам 848 код которых более 190, с помощью такого кода:

Код

procedure TForm1.Button7Click(Sender: TObject);

var
    i,p:integer;
begin
   if Length(RichEdit1.Text)>1 then begin
     for i := 1 to Length(RichEdit1.Text)  do  begin
         p:=Ord(RichEdit1.Text[i]);
         if p>190 then begin
            p:=p+848;
            Memo1.Text:=Memo1.Text+(Chr(p));
         end else
            Memo1.Text:=Memo1.Text+(Chr(p));
     end;
   end;
end;
 
Однако делается это очень медленно, соответственно может быть ктонить знает, что это за кодировка, и как большой объем символов конвертнуть в Unicode т.к. скорее всего проблема именно в этом.

Автор: Alexeis 21.8.2011, 10:40
Как бы неплохо узнать какая настоящая кодировка у страницы. Для UTF8 я делал так
Код

      http.Get(MyUrl, s);
      str := UTF8ToWideString(s.DataString);


Добавлено через 1 минуту и 41 секунду
P.S. браузером посмотри. Он показывает какую выбрал. 

Автор: Snowy 22.8.2011, 10:55
Обычная кодировка 1251. Просто набор символов западноевропейский, а не кириллица.
Смени чарсет на русский. Если он дефолтный, значит в системе дефолтный язык не русский.

Автор: Zlo 22.8.2011, 18:33
Да, это 1251. и браузеры ее спокойно пережевывают, а вот прога нет...
В системе везде стоит русский/Россия

Автор: Snowy 22.8.2011, 19:03
У тебя изначально где-то неверная перекодировка в юникод без указания кодировки прошла (кодировка 00, а не 04).
Чтобы проконтролировать данный процесс - получи результат в AnsiString.
Задача №1 - получить страницу в AnsiString.
Задача №2 - конвертировать в string любым имеющимся способом. Обычно простым присвоением. 
Если неудачно - искать другие способы. Но шаг №1 - обязательно.

Добавлено @ 19:08
Цитата(Zlo @  21.8.2011,  02:31 Найти цитируемый пост)
Однако делается это очень медленно
Конечно - ты же используешь RichEdit посимвольно, а также посимвольно выводишь в мемо.
Даведи 2 отдельные переменные - в одну присвой текст из ричедита, а результат складывай во вторую, которую потом и добавь в мемо - скорость вырастет в тысячи раз.
Но это совет про запас. На разных компьютерах ты можешь получить разный результат - где-то сконвертится нормально и ты на выходе получишь абракадабру.
Лучше перекодировать анси в юникод, а не юникод в юникод с вероятностью нарваться на китайский.

Автор: CodeMonkey 23.8.2011, 09:01
http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=68134.

http://www.webdelphi.ru/2011/06/obnovlenie-mlang-dobavlena-podderzhka-delphi-4-xe/.

Автор: Zlo 29.8.2011, 00:39
Спасибо CodeMonkey и всем помогавшим, проблема решена способом по ссылке http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=68134

Код

procedure TForm52.Button2Click(Sender: TObject);

  function FixString(const AData: String): String;
  var
    S: RawByteString;
    X: Integer;
  begin
    SetLength(S, Length(AData));
    for X := 1 to Length(AData) do
      S[X] := AnsiChar(AData[X]);
    SetCodePage(S, 1251, False);
    Result := S;
  end;

var
  S: String;
begin
  S := IdHTTP1.Get('http://cat.mau.ru/eur/');
  S := FixString(S);
  ShowMessage(S);
end;

Автор: CodeMonkey 29.8.2011, 10:01
*facepalm*

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)