![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
День добрый.
Программа принимает почту pop3. Раньше у меня стаяла старая версия Indy. При приеме тема была примерно такая Код:
Msg.Subject=A =?koi8-r?Ляляляля ==?= Далее у меня есть функция, которая декодирует текст по этим тэгам. Теперь я обновился до Indy 10 и тема выводится без тэгов " =?koi8-r?". То есть совершенно не понятно когда ее надо декодировать, когда нет. Вопрос как из IdMessage вытащить Subject c тэгами? Или может быть можно вытащить кодировку? |
|
#2
|
|||
|
|||
|
Код:
TIdMessage.NoDecode := True; Кстати, покажи функцию - что умеет (точнее, какие кодировки знает)? |
|
#3
|
|||
|
|||
|
Нашел на просторах глубокого интернета, правда немного изменил
строки 8-23 от меня, на случай длинного заголовка. http://www.sql.ru/forum/883437/pop3-...roblema-decode Код:
function DecodeStr(Text: String): String;
Var
P,P2,pz:Integer;
Temp,Dec, temp2 : String;
begin
Result:='';
if pos('=?',text)=0 then result:=text;
if pos('=?',text)>1 then
result:=copy(text,1,pos('=?',text)-1);
temp2:=StringReplace(text,' ','', [rfReplaceAll, rfIgnoreCase]);
Temp2:=Copy(Temp2,Pos('=?',LowerCase(temp2)),Length(temp2));
repeat
pz:=Pos('?=',LowerCase(temp2))+1;
if pz=2 then pz:=Pos('?=',LowerCase(temp2))+1;
if pz<15 then
pz:=length(temp2);
temp:=Copy(Temp2,Pos('=?',LowerCase(temp2)),pz);
delete(temp2,1,pz);
while pos('=?UTF-8?',UpperCase(Temp))>0 do begin
P:=pos('=?UTF-8?',UpperCase(Temp));
P2:=length(temp)-1;
Dec := Copy(Temp,p+10,P2-(P+10));
if UpperCase(Temp[P+8])='Q' then
Dec := Form2.IdDecoderQuotedPrintable1.DecodeString(Dec)
Else
Dec:=IdDecoderMIME1.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 := Form2.IdDecoderQuotedPrintable1.DecodeString(Dec)
Else
Dec:=IdDecoderMIME1.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+17,P2-(P+17));
if UpperCase(Temp[P+15])='Q' then
Dec := Form2.IdDecoderQuotedPrintable1.DecodeString(Dec)
Else
Dec:=IdDecoderMIME1.DecodeString(Dec);
Result:=Result+Copy(Temp,1,P-1)+Dec;
Temp:=Copy(Temp,P2+2,length(Temp));
End;
until length(temp2)<5;
end;
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;
|
|
#4
|
|||
|
|||
|
NoDecode увы не прокатило ((((.
Пока решение такое: Код:
Tema:=msg.Headers.Values['Subject'] |
|
#5
|
|||
|
|||
|
Ага, тоже вариант.
Мда, по коду. Интересно, но это только для русских кодировок... хотя на вооружение стоит взять... |
|
#6
|
|||
|
|||
|
Вот вопрос, а как получить исходную кодировку имени файла?
|
|
#7
|
|||
|
|||
|
Эм-м-м... не понял вопрос?
Какого файла? |
|
#8
|
|||
|
|||
|
Имя файла, в аттачменте тоже кодируется.
Как достать кодировку, которой было закодировано имя файл |
|
#9
|
|||
|
|||
|
Ну так оно тоже тем же способом, видимо, кодируется.
Еще в заголовке должен быть параметр - charset. Это языковая кодировка... |