Форум: "Сети";
Текущий архив: 2003.09.08;
Скачать: [xml.tar.bz2];
ВнизРабота с IMAP INDY 9.0 Найти похожие ветки
← →
ser (2003-06-17 12:49) [0]Мастера помогите плиз.
Есть такая проблема:
Конекчюсь к почтовому серверу(Linux): забираю список всех папок, проблема начинает возникать с русскими папками, я их получаю в непонятном виде (преобразование кодировок тоже не помогает). Тоже происходит и с получением темы письма.
Например название папки:
&BCEENQRABDMENQQ5-(serg) что в оригинале Мичкивский Сергей(serg)
Например тема:
=?koi8-r?B?8MXSxdDJ09ggy8/N0NjA1MXSz9c=?= что в оригинале звучит Перепись компьютеров.
Может все дело в настройках компонента.
Кто может помогите очень нужно.....
← →
MikeP (2003-06-17 13:17) [1]function TIdIMAP4.DecodeMailBoxName(AName: String): String;
var
outStr:String;
curPos:Integer;
minusPos:Integer;
ampPos:Integer;
ms:TMemoryStream;
bufSize:Integer;
buf:Pointer;
codedStr:String;
begin
outStr:="";
curPos:=1;
result:="";
while curPos<=Length(AName) do
begin
ampPos:=Pos("&",Copy(AName,curPos,Length(AName)-curPos+1));
if ampPos<=0 then ampPos:=Length(AName)+1 else ampPos:=ampPos+curPos-1;
outStr:=outStr+Copy(AName,curPos,ampPos-curPos);
curPos:=ampPos;
if curPos<=Length(AName)then
begin
minusPos:=Pos("-",Copy(AName,curPos,Length(AName)-curPos+1));
if minusPos<=0 then minusPos:=Length(AName)+1
else minusPos:=minusPos+curPos-1;
ms.Size:=0;
codedStr:=StringReplace(StringReplace(Copy(AName,curPos,minusPos-curPos+1),",","/",[rfReplaceAll]),"&","+",[rfReplaceAll]);
bufSize:=MultiByTeToWideChar(CP_UTF7,0,@codedStr[1],Length(codedStr),nil,0);
GetMem(buf,(bufSize+1)*sizeof(WideChar));
ZeroMemory(buf,(bufSize+1)*sizeof(WideChar));
try
if MultiByTeToWideChar(CP_UTF7,0,@codedStr[1],Length(codedStr),PWideChar(buf),bufSize)=0 then
RaiseLastWin32Error;
outStr:=outStr+WideCharToString(PWideChar(buf));
finally
FreeMem(buf);
end;
curPos:=minusPos+1;
end
end;
result:=outStr;
end;
← →
gedd (2003-06-18 11:10) [2]Неработает эта функция!
← →
MikeP (2003-06-18 14:01) [3]ms:TMemoryStream и ms.Size=0 лишние
← →
s_ser (2003-07-02 13:35) [4]Спасибо за помощь, а как насчет перекодировки темы письма
← →
vuk (2003-07-02 13:56) [5]to s_ser:
Насчет перекодировки темы. Это строка в формате MIME. Настройки компонента здесь не помогут, он не умеет работать с русскими кодировками, поэтому нужно писать парсер для таких строк.
Что есть что в этой строке:
=? - сигнатура строки
koi8-r - набор символов (может быть не только koi8-r)
? - разделитель
B - кодировка (B-base64, Q-quoted printable)
? - разделитель
8MXSxdDJ09ggy8/N0NjA1MXSz9c= - собственно строка в кодировке base64
?= - конец блока
Чтобы значение строки, нужно выделить данные и раскодировать их из base64. После этого получится строка в koi8-r, которую нужно будет преобразовать в Win1251.
Да, еще. Учтите, что в теме может быть несколько блоков, которые нужно будет сливать в одну строку.
← →
MikeP (2003-07-02 18:17) [6]в модуле IdCoderHeader есть ф-я DecodeHeader
модифицируешь ее след. образом:
после
if encodingstartpos = 0 then
encodingstartpos:=PosStartAt("=?WINDOWS", UpperCase(Header),1);
добавляешь
if encodingstartpos = 0 then
encodingstartpos:=PosStartAt("=?KOI", UpperCase(Header),1);
далее
после
if AnsiSameText(HeaderCharSet, "ISO-2022-JP") then {Do not Localize}
begin
substring := Decode2022JP(s)
end else
добавляешь
if AnsiSameText(HeaderCharSet,"koi8-r") then
begin
subString:=DecodeKOI(s);
end else
ф-ю типа DecodeKOI которая конвертит строку koi8 в строку win1251 можно найти легко, например в кладовке.
← →
s_ser (2003-07-07 10:58) [7]to MikeP
Скажем так с перекодировкой Q-quoted printable я разобрался осталось решить проблему с BASE-64. Твой последний пример решит ее или нет.
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2003.09.08;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c