Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Кодировки из чего-то во что-то 
V
    Опции темы
Zlo
  Дата 21.8.2011, 02:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 18.9.2004

Репутация: 1
Всего: 1



Столкнулся с проблемой в 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 т.к. скорее всего проблема именно в этом.
PM MAIL   Вверх
Alexeis
Дата 21.8.2011, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Как бы неплохо узнать какая настоящая кодировка у страницы. Для UTF8 я делал так
Код

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


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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Snowy
Дата 22.8.2011, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Обычная кодировка 1251. Просто набор символов западноевропейский, а не кириллица.
Смени чарсет на русский. Если он дефолтный, значит в системе дефолтный язык не русский.
PM MAIL   Вверх
Zlo
Дата 22.8.2011, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 18.9.2004

Репутация: 1
Всего: 1



Да, это 1251. и браузеры ее спокойно пережевывают, а вот прога нет...
В системе везде стоит русский/Россия
PM MAIL   Вверх
Snowy
Дата 22.8.2011, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



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

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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89





--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Zlo
Дата 29.8.2011, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 18.9.2004

Репутация: 1
Всего: 1



Спасибо 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;

PM MAIL   Вверх
CodeMonkey
Дата 29.8.2011, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



*facepalm*


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0532 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.