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

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> UTF-8 --> нормальный язык 
:(
    Опции темы
Sanek123
Дата 12.2.2009, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Получаю почту с разных ящиков в программе на делфе:
с pop.bk.ru - все путем, и полуает и отправляет, все читаемо все на своем месте.
с pop.mail.ru - дело совсем плохо. Английский текст еще ничего проходит, а все что на русском или картинки - какая-то караказябра, вроде как на UTF-8. Мне же соответственно нужно перекодировать на нормальный, понятный обычному смертному, язык (хотя бы текст на русском). Если кто знает подскажите как.
Может дело в Mail.ru или в моем почтовом клиенте. Причем отправляет с обоих ящиков - нормально, баг только в корректном получении с mail.ru.
--------------------
Вас разыскивают бойцы 139-го порта...
PM MAIL   Вверх
Snowy
Дата 12.2.2009, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



В заголовке письма указана кодировка.
Декодировать из UTF8 - Utf8Decode.
Обычно письма заворачивают в mime код Base64
PM MAIL   Вверх
Sanek123
Дата 12.2.2009, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Дело совсем плохо, UTF-8Decode не помогает. Изменение кодовой страницы 1251 на 1252 - тоже. По поводу Mime - ничего про нее не нашел, поковырял немного - невыходит. Плюс ко всему письма не только в UTF-8, но и в KOI8-r. И вообще некоторые (не с mail'а) норамально приходят. Но все-таки текст из Body - даже вытащить не получается, возвращает пустую строку.

Код выглядит где-то так:

Код

    for i:=1 to IdPOP31.CheckMessages do
     begin
      IdMessage1.Clear;
      IdPOP31.RetrieveHeader(i,IdMessage1);
      Memo2.Lines.Add('    '+IntToStr(i)+':    От: '+ DecodeStr(IdMessage1.From.Text));
      Memo2.Lines.Add('           Адрес: '+DecodeStr(IdMessage1.From.Address));
      Memo2.Lines.Add('           Имя: '+DecodeStr(IdMessage1.From.Name));
      Memo2.Lines.Add('           Тема: '+DecodeStr(IdMessage1.Subject));
      Memo2.Lines.Add('           Сервер: '+DecodeStr(IdMessage1.MsgId));
      Memo2.Lines.Add('           Attachement Encoding: '+DecodeStr(IdMessage1.AttachmentEncoding));
      Memo2.Lines.Add('           Charset: '+DecodeStr(IdMessage1.CharSet));
      Memo2.Lines.Add('           Текст сообщения: '+ (IdMessage1.Body.Text));
      Memo2.Lines.Add(' ');  
     end;
    IdPOP31.Disconnect;
   end;


Что касается декодирования:

Код

function DecodeStr(Text: string): string;
var
 Temp, Dec: string;
 P,P2:Integer;
begin
 Temp:=Text;
 Result:='';

 while pos('=?windows-1251?',Temp)>0 do
  begin
   P:=pos('=?windows-1251?',Temp);
   P2:=pos('?=',Temp);
   Dec:=Copy(Temp,p+17,P2-(P+17));
   Dec:=Form1.IdDecoderMIME1.DecodeString(Dec);
   Result:=Result+Copy(Temp,1,P-1)+Dec;
   Temp:=Copy(Temp,P2+2,length(Temp));
  end;
 Result:=Result+Temp;
 Temp:=Result;

 Result:='';
 while pos('=?koi8-r?',Temp)>0 do
  begin
   P:=pos('=?koi8-r?',Temp);
   P2:=pos('?=',Temp);
   Dec:=Copy(Temp,p+11,P2-(P+11));
   try
    if Dec<>''
    then Dec:=KOI8_RToUTF16Str(Form1.IdDecoderMIME1.DecodeString(Dec));
   except

   end;
   Result:=Result+Copy(Temp,1,P-1)+Dec;
   Temp:=Copy(Temp,P2+2,length(Temp));
  end;
 Result:=Result+Temp;
end;


Вот. И в конечном счете выходит что-то такое:

------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Имя почтового ящика (POP): [email protected] (всего сообщений: 71)  Объем: 204,854Kb
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    1:    От: =?UTF-8?B?0KTQvtGA0YPQvCDQv9GA0L7Qs9GA0LDQvNC80LjRgdGC0L7Qsg==?= <[email protected]>
           Адрес: [email protected]
           Имя: =?UTF-8?B?0KTQvtGA0YPQvCDQv9GA0L7Qs9GA0LDQvNC80LjRgdGC0L7Qsg==?=
           Тема: =?UTF-8?Q?=D0=A3=D0=B2=D0=B5=D0=B4=D0=BE=D0=BC?= =?UTF-8?Q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE=20=D0=BD=D0=BE=D0=B2?= =?UTF-8?Q?=D0=BE=D0=B9=20=D1=82=D0=B5=D0=BC=D0=B5=20=D0=B2=20=D0=BF=D0=BE?= =?UTF-8?Q?=D0=B4=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=BD=D0=BE=D0=BC=20=D1=84?= =?UTF-8?Q?=D0=BE=D1=80=D1=83=D0=BC=D0=B5=20=28=20From=20=D0=A4=D0=BE?= =?UTF-8?Q?=D1=80=D1=83=D0=BC=20=D0=BF=D1=80=D0=BE=D0=B3=D1=80=D0=B0=D0=BC?= =?UTF-8?Q?=D0=BC=D0=B8=D1=81=D1=82=D0=BE=D0=B2=20=29?=
           Сервер: <[email protected]>
           Attachement Encoding: MIME
           Charset: UTF-8
           Текст сообщения: 

    2:    От: "Мой " <"Мир@Mail.Ru<myadmin"@corp.mail.ru>>
           Адрес: Мир@Mail.Ru<[email protected]>
           Имя: Мой 
           Тема: Действия Ваших друзей за 9 февраля
           Сервер: <[email protected]>
           Attachement Encoding: MIME
           Charset: 
           Текст сообщения: 


Я уже не говорю про картинки и прочее, хотя бы текст почитать.
--------------------
Вас разыскивают бойцы 139-го порта...
PM MAIL   Вверх
Snowy
Дата 13.2.2009, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ты декодируешь только mime 1251 и кои-8. 
Это, мягко говоря, маловато.
Цитата(Snowy @  18.1.2008,  13:37 Найти цитируемый пост)
=?XXXX?C?SSSSS?=
Если строка заключена в =? ?= - это кодированная строка.
XXX - это кодировка текста.
C - метод кодирования. 
B - Base64, Q - Quoted PrintableSSSSS - сам кодированный текст.
То есть в случае =?Utf-8?B?QXJvbg==?= мы видим, что строка в кодировке utf-8 закодирована в Base64.
Берём строку, декодируем её из Base-64, затем конвертим из Utf-8 в нужную кодировку.

Это по заголовку.

Если в Body пусто, значит сообщение, скорее всего, в html формате.
Тут тебе поможет поиск по форуму по слову IdAttachment
PM MAIL   Вверх
bokus
Дата 2.9.2013, 05:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я декодирую так 

Код

function B_KOI8R2ANSI(S: string): string;
Const
  KOI8_CODE = 'бвчздецъйклмнопртуфхжигюыэящшьасБВЧЗДЕЦЪЙКЛМНОПРТУФХЖИГЮЫЭЯЩШЬАС—Ј';
  ANSI_CODE = 'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя№ё';
var
  i: integer;
begin
  Result := S;
  for i := 1 to Length(Result) do
    if Pos(Result[i], KOI8_CODE) > 0 then
      Result[i] := ANSI_CODE [Pos(Result[i], KOI8_CODE)];
end;

  Function DecodeFileName (FNDecode:String):String;
  Var
    P,P2:Integer;
    Temp,Dec : String;
  begin
    Result:='';
    Temp:= ReplaceStr(FNDecode,' ','');
    Temp:=Copy(Temp,Pos('=?',LowerCase(temp)),Length(temp));
    
    while pos('=?UTF-8?',UpperCase(Temp))>0 do begin
      P:=pos('=?UTF-8?',UpperCase(Temp));
      P2:=pos('?=',Temp);
      Dec := Copy(Temp,p+10,P2-(P+10));
      if UpperCase(Temp[P+8])='Q' then
        Dec := Form1.IdDecoderQuotedPrintable1.DecodeString(Dec)
      Else
        Dec:=EncdDecd.DecodeString(Dec);
      Dec:=Utf8ToAnsi(Dec);
      Result:=Result+Copy(Temp,1,P-1)+Dec;
      Temp:=Copy(Temp,P2+2,length(Temp));
    End;

    while pos('=?KOI8-R?',UpperCase(Temp))>0 do begin
      P:=pos('=?KOI8-R?',UpperCase(Temp));
      P2:=pos('?=',Temp);
      Dec := Copy(Temp,p+11,P2-(P+11));
      if UpperCase(Temp[P+9])='Q' then
        Dec := Form1.IdDecoderQuotedPrintable1.DecodeString(Dec)
      Else
        Dec:=EncdDecd.DecodeString(Dec);
      Dec:=B_KOI8R2ANSI(Dec);
      Result:=Result+Copy(Temp,1,P-1)+Dec;
      Temp:=Copy(Temp,P2+2,length(Temp));
    End;

    while pos('=?WINDOWS-1251?',UpperCase(Temp))>0 do begin
      P:=pos('=?WINDOWS-1251?',UpperCase(Temp));
      P2:=pos('?=',Temp);
      Dec := Copy(Temp,p+15,P2-(P+15));
      Dec := Form1.IdDecoderQuotedPrintable1.DecodeString(Dec);
      Result:=Result+Copy(Temp,1,P-1)+Dec;
      Temp:=Copy(Temp,P2+2,length(Temp));
    End;
    if Result='' then
      Result:= Temp;
  end;


получение почты не описываю но имя файла для обработки беру так

              
Код

  if IdMessage1.MessageParts[Countfile_F] is TIdAttachmentFile  then begin
                  FileName:=DecodeFileName(TIdAttachmentFile(IdMessage1.MessageParts.Items[Countfile_F]).Headers.Values['Content-Type']);


писалось на Вorland Delphi 10.0.2151.25345 + indy10 
PM MAIL   Вверх
bems
Дата 2.9.2013, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

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



Думаю за 4 года вопрос решили как-то


--------------------
Обижено школьников: 8
PM MAIL   Вверх
  
Закрытая темаСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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