Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > EMail, tidPop3 Проблема с кодировкой


Автор: murod 8.2.2006, 18:16
наверно у меня проблема с кодировкой. Я открываю Еmail и оттуда следующим образом качаю
прикрепленные файлы.
Код

pop:tidpop3;
**********************************
    msg:=TIdMessage.Create(pop);
    pop.Retrieve(mc,msg);
    for i:=0 to msg.MessageParts.Count-1 do
      begin
       if saveat then
       with msg.MessageParts do
        begin
         form1.Repaint;
         if items[i].ClassType=TIdAttachment then
           with TIdAttachment(items[i]) do
             try
              ext:=LowerCase(ExtractFileExt(filename));
              if ext='.txt' then
               begin
                if not directoryexists(folder+'\messages') then createdir(folder+'\messages');
                SaveToFile(folder+'\messages\'+filename);
                if fileexists(folder+'\messages\'+filename) then
                 begin
                   assignfile(fayl,folder+'\messages\'+filename);
                   Append(fayl);
                   writeln(fayl,'***Message begin***');
                   writeln(fayl,lastf);
                   writeln(fayl,'***end***');
                   closefile(fayl);
                 end;
               end;
             except Form1.Memo1.Lines.Add('Cannot copy mail- '+FileName); end;
        end;
      end;

Файлы с расширением *.тхт. всё качается нормално, но тока текст: "Печать по две шт" Преврашается в абра-кадабру:"Печать РїРѕ РґРІРµ С?С‚ " и с именем файла тоже точно так. Кто знает подскажите пожалуйста в чем проблема? Буду очень рад.

Автор: Snowy 8.2.2006, 19:14
Это не абракадабра, а юникод.
Запихивай его в переменную типа WideChar, тогда сможешь спокойно работать.
Добавлено @ 19:17
И еще совет:
не
Код
directoryexists(folder+'\messages') then createdir(folder+'\messages');
,а
Код
ForceDirectories(folder+'\messages');

Автор: murod 8.2.2006, 19:20
Спасибо. Пожалуйста если не трудно скинте пару строчек примера. с шрифтами, кодировками у меня очень плохо. smile
Добавлено @ 19:24
и еще как быть с именем файла? и тут тоже точно такие проблемы! filename в widestring надо конвертить?

Автор: Snowy 8.2.2006, 19:27
Вот пример перекодирования файла из Unicode в Ansi:
Код
var
  w: WideString;
  s: string;
  fs: TFileStream;
begin
  fs:=TFileStream.Create('C:\1.txt', fmOpenRead or fmShareDenyNone);
  SetLength(w, (fs.Size + 1) div SizeOf(WideChar));
  fs.ReadBuffer(w[1], fs.Size);
  s := w;
  fs.Free;
  fs:=TFileStream.Create('C:\2.txt', fmCreate);
  fs.Write(s[1], Length(s));
  fs.Free;
end;

Автор: murod 8.2.2006, 19:31
спасибо, шас попробую

Автор: Snowy 8.2.2006, 19:33
А вот тебе функция для перекодирования строки из юникода в анси, для случая, когда юникод текст у тебя в стринге:
Код

function UniToAnsi(s: string): string;
var
  w: WideString;
begin
  SetLength(w, (Length(s) + 1) div SizeOf(WideChar));
  move(s[1], w[1], Length(s));
  result := w;
end;

Автор: murod 8.2.2006, 19:35
а просто саму кодировку чтения с email а поменять нельзя?

Автор: Snowy 8.2.2006, 19:38
Нет. Кодировку определяешь не ты, а человек, отправивший письмо.
В какой кодировке он написал, в такой ты и принимаешь.

Автор: murod 8.2.2006, 19:42
мне шас надо сперва скачать файл а потом его конвертнуть ? И на какую кодировку надо мне конвертнуть? Первоначальная кодировка у меня какая?

Автор: Snowy 8.2.2006, 19:45
Цитата(murod @ 8.2.2006, 19:42 Найти цитируемый пост)
мне шас надо сперва скачать файл а потом его конвертнуть
Естественно. Пока ты его не скачаешь, ничего с ним делать не сможешь.

Цитата(murod @ 8.2.2006, 19:42 Найти цитируемый пост)
И на какую кодировку надо мне конвертнуть
В обычную Ansi. Смотри первый код. Как раз для тебя и написал.

Цитата(murod @ 8.2.2006, 19:42 Найти цитируемый пост)
Первоначальная кодировка у меня какая?
Unicode UTF-16. Он же WideString. Он же просто юникод.

Автор: murod 8.2.2006, 19:51
Понятно, а первоначальная кодировка будет менятся в зависимости кто его отправил
значить мне надо с перва узнать кодировку письма, и потом соответственно надо его конвертнуть на Ansi я прав?

Автор: Snowy 8.2.2006, 20:51
Именно. Но это далеко не так просто.
Например у Outlook это не получается, а TheBat справляется весьма неплохо.
Так что это довольно сложный вопрос.
Но с юникодом проще. Существует функция, которая тебе поможет.
Код

if IsTextUnicode(pointer(s), Length(s), nil) then ЭтоЮникод!;

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