Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.03;
Скачать: CL | DM;

Вниз

Фунция KoiToWin и сообщение с аттачем   Найти похожие ветки 

 
Yeg   (2006-07-14 09:25) [0]

Почему такая функция работает не правильно, если сообщение имеет аттач (я получаю только Headers через Indy). Когда я хочу раскодировать Subject, то ничего не получается:

Koi: array[0..66] of Char = (
"T", "¨", "¸", "À", "Á", "Â", "Ã", "Ä", "Å", "Æ",
"Ç", "È", "É", "Ê", "Ë", "Ì", "Í", "Î", "Ï", "Ð",
"Ñ", "Ò", "Ó", "Ô", "Õ", "Ö", "×", "Ø", "Ù", "Ú",
"Û", "Ü", "Ý", "Þ", "ß", "à", "á", "â", "ã", "ä",
"å", "æ", "ç", "è", "é", "ê", "ë", "ì", "í", "î",
"ï", "ð", "ñ", "ò", "ó", "ô", "õ", "ö", "÷", "ø",
"ù", "ú", "û", "ü", "ý", "þ", "ÿ");

Win: array[0..66] of Char = (
"¸", "¨", "T", "þ", "à", "á", "ö", "ä", "å", "ô",
"ã", "õ", "è", "é", "ê", "ë", "ì", "í", "î", "ï",
"ÿ", "ð", "ñ", "ò", "ó", "æ", "â", "ü", "û", "ç",
"ø", "ý", "ù", "÷", "ú", "Þ", "À", "Á", "Ö", "Ä",
"Å", "Ô", "Ã", "Õ", "È", "É", "Ê", "Ë", "Ì", "Í",
"Î", "Ï", "ß", "Ð", "Ñ", "Ò", "Ó", "Æ", "Â", "Ü",
"Û", "Ç", "Ø", "Ý", "Ù", "×", "Ú");

function KoiToWin(Str: string): string;
var
 i, j, index: Integer;
begin
 Result := "";

 for i := 1 to Length(Str) do
 begin
   index := -1;
   for j := Low(Win) to High(Win) do
     if Koi[j] = Str[i] then
     begin
       index := j;
       Break;
     end;

   if index = -1 then
     Result := Result + Str[i]
   else
     Result := Result + Win[index];
 end;
end;


 
Slym ©   (2006-07-14 09:33) [1]

unit CharsetAnalis;

interface
uses Classes;
type
 TCharSet=(csWin,csKoi,csIso,csDos);
const
 CharSetStrings:array [TCharSet] of String=("Win","Koi","Iso","Dos");

function StrCharSetConver(const AStr:string;AFrom,ATo:TCharSet):string;
procedure StreamCharSetConver(InStream,OutStream:TStream;AFrom,ATo:TCharSet);
function StrCharSet(const AStr:string):TCharSet;
function StreamCharSet(Stream:TStream):TCharSet;

implementation
const
CharsSet:array[TCharSet] of string=(
"АаБбВвГгДдЕеЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭэЮюЯя",
"юЮаАбБцЦдДеЕфФгГхХиИйЙкКлЛмМнНоОпПяЯрРсСтТуУжЖвВьЬыЫзЗшШэЭщЩчЧъЪ",
"РрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭэЮюЯяа№бёвђгѓдєеѕжізїијйљкњлћмќн§оўпџ",
#128#160#129#161#130#162#131#163#132#164#133#165#134#166#135#167#136#168#137#169 #138#170+
#139#171#140#172#141#173#142#174#143#175#144#224#145#225#146#226#147#227#148#228 #149#229+
#150#230#151#231#152#232#153#233#154#234#155#235#156#236#157#237#158#238#159#239 );

var Norm:array["А".."я"] of double;

procedure PrepareNorm;
begin
norm["А"]:=0.001;
norm["Б"]:=0;
norm["В"]:=0.002;
norm["Г"]:=0;
norm["Д"]:=0.001;
norm["Е"]:=0.001;
norm["Ж"]:=0;
norm["З"]:=0;
norm["И"]:=0.001;
norm["Й"]:=0;
norm["К"]:=0.001;
norm["Л"]:=0;

norm["М"]:=0.001;
norm["Н"]:=0.001;
norm["О"]:=0.001;
norm["П"]:=0.002;
norm["Р"]:=0.002;
norm["С"]:=0.001;
norm["Т"]:=0.001;
norm["У"]:=0;
norm["Ф"]:=0;
norm["Х"]:=0;
norm["Ц"]:=0;
norm["Ч"]:=0.001;
norm["Ш"]:=0.001;
norm["Щ"]:=0;
norm["Ъ"]:=0;
norm["Ы"]:=0;
norm["Ь"]:=0;

norm["Э"]:=0.001;
norm["Ю"]:=0;
norm["Я"]:=0;
norm["а"]:=0.057;
norm["б"]:=0.01;
norm["в"]:=0.031;
norm["г"]:=0.011;
norm["д"]:=0.021;
norm["е"]:=0.067;
norm["ж"]:=0.007;
norm["з"]:=0.013;
norm["и"]:=0.052;
norm["й"]:=0.011;
norm["к"]:=0.023;
norm["л"]:=0.03;
norm["м"]:=0.024;

norm["н"]:=0.043;
norm["о"]:=0.075;
norm["п"]:=0.026;
norm["р"]:=0.038;
norm["с"]:=0.034;
norm["т"]:=0.046;
norm["у"]:=0.016;
norm["ф"]:=0.001;
norm["х"]:=0.006;
norm["ц"]:=0.002;
norm["ч"]:=0.011;
norm["ш"]:=0.004;
norm["щ"]:=0.004;
norm["ъ"]:=0;
norm["ы"]:=0.012;
norm["ь"]:=0.012;

norm["э"]:=0.003;
norm["ю"]:=0.005;
norm["я"]:=0.015;
end;

function StrCharSetConver(const AStr:string;AFrom,ATo:TCharSet):string;
var
 Chars:array[char] of char;
 c:char;
 i:integer;
begin
 if AFrom=ATo then
 begin
   result:=AStr;
   exit;
 end;
 for c:=#0 to #255 do Chars[c]:=c;//CodeTable
 for i:=1 to Length(CharsSet[csWin]) do
   Chars[CharsSet[ATo][i]]:=CharsSet[AFrom][i];

 SetLength(result,Length(AStr));
 for i:=1 to Length(AStr) do//Decode
   result[i]:=Chars[AStr[i]];
end;

procedure StreamCharSetConver(InStream,OutStream:TStream;AFrom,ATo:TCharSet);
var
 Chars:array[char] of char;
 c:char;
 buf:array[byte] of char;
 i,Readed:byte;
begin
 if AFrom=ATo then
 begin
   OutStream.CopyFrom(InStream,0);
   exit;
 end;
 for c:=#0 to #255 do Chars[c]:=c;//CodeTable
 for i:=1 to Length(CharsSet[csWin]) do
   Chars[CharsSet[ATo][i]]:=CharsSet[AFrom][i];
 InStream.Position:=0;
 while InStream.Position<InStream.Size do
 begin
   Readed:=InStream.Read(buf,256)-1;
   if Readed<=0 then Continue;
   for i:=0 to Readed do
     buf[i]:=Chars[buf[i]];
   OutStream.WriteBuffer(buf,Readed);
 end;
end;

function StrCharSet(const AStr:string):TCharSet;
var
 CharSet: TCharSet;
 Count:array[char] of integer;
 d,min: single;
 s:string;
 i:integer;
 c:char;
begin
 result:=csWin;
 if length(AStr)=0 then exit;
 fillchar(Count,sizeof(Count),0);
 for i:=1 to Length(AStr) do
   inc(Count[AStr[i]]);
 min:=0;
 for c:="А" to "я" do
   min:=min+sqr(Count[c]/Length(AStr)-Norm[c]);

 for CharSet:=low(TCharSet) to high(TCharSet) do
 begin
   if CharSet=csWin then continue;
   s:=StrCharSetConver(AStr,CharSet,csWin);

   fillchar(Count,SizeOf(Count),0);//counting chars
   for i:=1 to Length(s) do
     inc(Count[s[i]]);

   d:=0;//calculation
   for c:="А" to "я" do
     d:=d+sqr(Count[c]/Length(s)-Norm[c]);
   if d<min then
   begin
     result:=CharSet;
     min:=d;
   end;
 end;
end;

function StreamCharSet(Stream:TStream):TCharSet;
var
 CharSet: TCharSet;
 Count:array[char] of integer;
 d,min: single;
 ms:TMemoryStream;
 c:char;
begin
 result:=csWin;
 if Stream.Size=0 then exit;
 fillchar(Count,sizeof(Count),0);
 Stream.Position:=0;
 while Stream.Position<Stream.Size do
 begin
   Stream.Read(c,1);
   inc(Count[c]);
 end;
 min:=0;
 for c:="А" to "я" do
   min:=min+sqr(Count[c]/Stream.Size-Norm[c]);
 ms:=TMemoryStream.Create;
 try
   for CharSet:=low(TCharSet) to high(TCharSet) do
   begin
     if CharSet=csWin then continue;
     ms.Clear;
     StreamCharSetConver(Stream,ms,CharSet,csWin);
     fillchar(Count,SizeOf(Count),0);//counting chars
     ms.Position:=0;
     while ms.Position<ms.Size do
     begin
       ms.Read(c,1);
       inc(Count[c]);
     end;

     d:=0;//calculation
     for c:="А" to "я" do
       d:=d+sqr(Count[c]/ms.size-Norm[c]);
     if d<min then
     begin
       result:=CharSet;
       min:=d;
     end;
   end;
 finally
   ms.Free;
 end;
end;

initialization
 PrepareNorm;

end.


 
Yeg   (2006-07-14 09:34) [2]

Да, я щас посмотрел, у сообщений с аттачем почему то CharSet = ""! Это так и должно быть?


 
Slym ©   (2006-07-14 09:47) [3]

Subject: =?windows-1251?B?лялятополя64==?=
        =?кодировка_текста?кодировка_транспортная?текст?=
Subject: lyalyatopolya
        7битныйтекст аля eng


 
Slym ©   (2006-07-14 09:47) [4]

Yeg   (14.07.06 9:34) [2]
CharSet = ""!

У тебя 7битный текст



Страницы: 1 вся ветка

Текущий архив: 2006.12.03;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.055 c
15-1163416926
wezzz
2006-11-13 14:22
2006.12.03
Определить без тестера 0 или заземление?


2-1163196950
Busik
2006-11-11 01:15
2006.12.03
Как паковать WinRar ом из Delphi


2-1163402344
vegarulez
2006-11-13 10:19
2006.12.03
Как отключить меню "пуск" в винде...


2-1163602889
Новый_Юзер
2006-11-15 18:01
2006.12.03
Панель инструментов и кнопки с картинками из ImageList a


2-1163610135
Riply
2006-11-15 20:02
2006.12.03
Вопросы из разряда "Почему верблюд не ест вату ?"