<TITLE>«Королевство Dельфи» Виртуальный клуб программистов</TITLE>
<META NAME="keywords" CONTENT="delphi programmer programm programming
club delphi hint дельфи программист программирование программа виртуальный
клуб дельфи советы компоненты взаимопомощь дельфи delphi">
<META NAME="description" CONTENT="Delphi Programmer Club. Using hints.
Виртуальный клуб программистов на Дельфи. Использование всплывающих подсказок">
const
Koi =
'юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ';
Win =
'бвчздецъйклмнопртуфхжигюыэящшьасБВЧЗДЕЦЪЙКЛМНОПРТУФХЖИГЮЫЭЯЩШЬАС';
SerH = 'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ';
SerL = 'абвгдежзийклмнопрстуфхцчшщъыьэюя';
procedure ANSI2KOI(var Str: string);
var i: integer; k: byte;
begin
for i := 1 to Length(Str) do begin
k := byte(Str[i]);
if k = $B8 then Str[i] := char($A3) else
if k = $A8 then Str[i] := char($B3) else
if k > $BF then Str[i] := Win[k - $BF];
end;
end;
procedure KOI2ANSI(var Str: string);
var i: integer; k: byte;
begin
for i := 1 to Length(Str) do begin
k := byte(Str[i]);
if k = $A3 then Str[i] := 'ё' else
if k = $B3 then Str[i] := 'Ё' else
if k > $BF then Str[i] := Koi[k - $BF];
end;
end;
procedure ANSI2IBM(var Str: string);
var i: integer; k: byte;
begin
for i := 1 to Length(Str) do begin
k := byte(Str[i]);
if k = $B8 then Str[i] := char($F1) else
if k = $A8 then Str[i] := char($F0) else
if k > $EF then Str[i] := char(k - 16) else
if (k > $BF) and (k < $F0) then Str[i] := char(k - 64);
end;
end;
procedure IBM2ANSI(var Str: string);
var i: integer; k: byte;
begin
for i := 1 to Length(Str) do begin
k := byte(Str[i]);
if k = $F0 then Str[i] := 'Ё' else
if k = $F1 then Str[i] := 'ё' else
if (k > $7F) and (k < $A0) then Str[i] := SerH[k - $7F] else
if (k > $9F) and (k < $B0) then Str[i] := SerL[k - $9F] else
if (k > $DF) and (k < $F0) then Str[i] := SerL[k - $CF];
end;
end;
procedure ANSI2Mac(var Str: string);
var i: integer; k: byte;
begin
for i := 1 to Length(Str) do begin
k := byte(Str[i]);
if k = $A8 then Str[i] := char($DD) else
if k = $B8 then Str[i] := char($DE) else
if k = $FF then Str[i] := char($DF) else
if (k > $BF) and (k < $E0) then Str[i] := char(k - 64);
end;
end;
procedure Mac2ANSI(var Str: string);
var i: integer; k: byte;
begin
for i := 1 to Length(Str) do begin
k := byte(Str[i]);
if k = $DD then Str[i] := 'Ё' else
if k = $DE then Str[i] := 'ё' else
if k = $DF then Str[i] := 'я' else
if (k > $7F) and (k < $A0) then Str[i] := SerH[k - $7F] else
if (k > $DF) and (k < $FF) then Str[i] := SerL[k - $DF];
end;
end;
procedure ANSI2ISO(var Str: string);
var i: integer; k: byte;
begin
for i := 1 to Length(Str) do begin
k := byte(Str[i]);
if k = $A8 then Str[i] := char($A1) else
if k = $B8 then Str[i] := char($F1) else
if k > $BF then Str[i] := char(k - 16);
end;
end;
procedure ISO2ANSI(var Str: string);
var i: integer; k: byte;
begin
for i := 1 to Length(Str) do begin
k := byte(Str[i]);
if k = $A1 then Str[i] := 'Ё' else
if k = $F1 then Str[i] := 'ё' else
if k < $F0 then begin
if k > $CF then Str[i] := SerL[k - $CF] else
if k > $AF then Str[i] := SerH[k - $AF];
end;
end;
end;
---
<P></P>
<A HREF="#conten"><FONT COLOR="666666">Вернуться наверх</FONT></A>
<!--- End track --->
<P></P>
<HR><A NAME="_3"></A>
Вариант №3 (31.01.00) Автор: <A HREF="mailto:nekhoroshkov@novolabs.ru">Constantin G. Nekhoroshkov</A>
<P></P>
Предлагаю всеобщему вниманию вот такой вот unit. Он решает проблемы
конвертации не только Win1251->KOI8 но и конвертации в другие
кодировки.
//---Begin of Unit RusChar
Unit RusChar;
interface
Function ALT2ISO(Ch1: byte): byte;
Function ALT2KOI(Ch1: byte): byte;
Function ALT2MAC(Ch1: byte): byte;
Function ALT2WIN(Ch1: byte): byte;
Function ISO2ALT(Ch1: byte): byte;
Function ISO2KOI(Ch1: byte): byte;
Function ISO2MAC(Ch1: byte): byte;
Function ISO2WIN(Ch1: byte): byte;
Function KOI2ALT(Ch1: byte): byte;
Function KOI2ISO(Ch1: byte): byte;
Function KOI2MAC(Ch1: byte): byte;
Function KOI2WIN(Ch1: byte): byte;
Function MAC2ALT(Ch1: byte): byte;
Function MAC2ISO(Ch1: byte): byte;
Function MAC2KOI(Ch1: byte): byte;
Function MAC2WIN(Ch1: byte): byte;
Function WIN2ALT(Ch1: byte): byte;
Function WIN2ISO(Ch1: byte): byte;
Function WIN2KOI(Ch1: byte): byte;
Function WIN2MAC(Ch1: byte): byte;
Function ConvertString(InputString: string; Convert_Flag: byte): string;
implementation
Const
//Alt decode contants
ALT_2_ISO=1;
ALT_2_KOI=2;
ALT_2_MAC=3;
ALT_2_WIN=4;
//Iso decode contants
ISO_2_ALT=5;
ISO_2_KOI=6;
ISO_2_MAC=7;
ISO_2_WIN=8;
//Koi decode contants
KOI_2_ALT=9;
KOI_2_ISO=10;
KOI_2_MAC=11;
KOI_2_WIN=12;
//Mac decode contants
MAC_2_ALT=13;
MAC_2_ISO=14;
MAC_2_KOI=15;
MAC_2_WIN=16;
//Win decode contants
WIN_2_ALT=17;
WIN_2_ISO=18;
WIN_2_KOI=19;
WIN_2_MAC=20;
ALTTable: array [1..64] of byte =(
128, 129, 130, 131, 132, 133, 134, 135,
136, 137, 138, 139, 140, 141, 142, 143,
144, 145, 146, 147, 148, 149, 150, 151,
152, 153, 154, 155, 156, 157, 158, 159,
160, 161, 162, 163, 164, 165, 166, 167,
168, 169, 170, 171, 172, 173, 174, 175,
224, 225, 226, 227, 228, 229, 230, 231,
232, 233, 234, 235, 236, 237, 238, 239
);
ISOTable: array [1..64] of byte =(
176, 177, 178, 179, 180, 181, 182, 183,
184, 185, 186, 187, 188, 189, 190, 191,
192, 193, 194, 195, 196, 197, 198, 199,
200, 201, 202, 203, 204, 205, 206, 207,
208, 209, 210, 211, 212, 213, 214, 215,
216, 217, 218, 219, 220, 221, 222, 223,
224, 225, 226, 227, 228, 229, 230, 231,
232, 233, 234, 235, 236, 237, 238, 239
);
KOITable: array [1..64] of byte =(
225, 226, 247, 231, 228, 229, 246, 250,
233, 234, 235, 236, 237, 238, 239, 240,
242, 243, 244, 245, 230, 232, 227, 254,
251, 253, 255, 249, 248, 252, 224, 241,
193, 194, 215, 199, 196, 197, 214, 218,
201, 202, 203, 204, 205, 206, 207, 208,
210, 211, 212, 213, 198, 200, 195, 222,
219, 221, 223, 217, 216, 220, 192, 209
);
MACTable: array [1..64] of byte =(
128, 129, 130, 131, 132, 133, 134, 135,
136, 137, 138, 139, 140, 141, 142, 143,
144, 145, 146, 147, 148, 149, 150, 151,
152, 153, 154, 155, 156, 157, 158, 159,
224, 225, 226, 227, 228, 229, 230, 231,
232, 233, 234, 235, 236, 237, 238, 239,
240, 241, 242, 243, 244, 245, 246, 247,
248, 249, 250, 251, 252, 253, 254, 223
);
WINTable: array [1..64] of byte =(
192, 193, 194, 195, 196, 197, 198, 199,
200, 201, 202, 203, 204, 205, 206, 207,
208, 209, 210, 211, 212, 213, 214, 215,
216, 217, 218, 219, 220, 221, 222, 223,
224, 225, 226, 227, 228, 229, 230, 231,
232, 233, 234, 235, 236, 237, 238, 239,
240, 241, 242, 243, 244, 245, 246, 247,
248, 249, 250, 251, 252, 253, 254, 255
);
Function ALT2ISO(Ch1: byte): byte;
Var
i: byte;
begin
For i:=1 to 64 do begin
If ALTTable[i]=ch1 then begin
ALT2ISO:=ISOtable[i];
exit;
end;
end;
ALT2ISO:=ch1;
end;
Function ALT2KOI(Ch1: byte): byte;
Var
i: byte;
begin
For i:=1 to 64 do begin
If ALTTable[i]=ch1 then begin
ALT2KOI:=KOItable[i];
exit;
end;
end;
ALT2KOI:=ch1;
end;
Function ALT2MAC(Ch1: byte): byte;
Var
i: byte;
begin
For i:=1 to 64 do begin
If ALTTable[i]=ch1 then begin
ALT2MAC:=MACtable[i];
exit;
end;
end;
ALT2MAC:=ch1;
end;
Function ALT2WIN(Ch1: byte): byte;
Var
i: byte;
begin
For i:=1 to 64 do begin
If ALTTable[i]=ch1 then begin
ALT2WIN:=WINtable[i];
exit;
end;
end;
ALT2WIN:=ch1;
end;
Function ISO2ALT(Ch1: byte): byte;
Var
i: byte;
begin
For i:=1 to 64 do begin
If ISOTable[i]=ch1 then begin
ISO2ALT:=ALTtable[i];
exit;
end;
end;
ISO2ALT:=ch1;
end;
Function ISO2KOI(Ch1: byte): byte;
Var
i: byte;
begin
For i:=1 to 64 do begin
If ISOTable[i]=ch1 then begin
ISO2KOI:=KOItable[i];
exit;
end;
end;
ISO2KOI:=ch1;
end;
Function ISO2MAC(Ch1: byte): byte;
Var
i: byte;
begin
For i:=1 to 64 do begin
If ISOTable[i]=ch1 then begin
ISO2MAC:=MACtable[i];
exit;
end;
end;
ISO2MAC:=ch1;
end;
Function ISO2WIN(Ch1: byte): byte;
Var
i: byte;
begin
For i:=1 to 64 do begin
If ISOTable[i]=ch1 then begin
ISO2WIN:=WINtable[i];
exit;
end;
end;
ISO2WIN:=ch1;
end;
Function KOI2ALT(Ch1: byte): byte;
Var
i: byte;
begin
For i:=1 to 64 do begin
If KOITable[i]=ch1 then begin
KOI2ALT:=ALTtable[i];
exit;
end;
end;
KOI2ALT:=ch1;
end;
Function KOI2ISO(Ch1: byte): byte;
Var
i: byte;
begin
For i:=1 to 64 do begin
If KOITable[i]=ch1 then begin
KOI2ISO:=ISOtable[i];
exit;
end;
end;
KOI2ISO:=ch1;
end;
Function KOI2MAC(Ch1: byte): byte;
Var
i: byte;
begin
For i:=1 to 64 do begin
If KOITable[i]=ch1 then begin
KOI2MAC:=MACtable[i];
exit;
end;
end;
KOI2MAC:=ch1;
end;
Function KOI2WIN(Ch1: byte): byte;
Var
i: byte;
begin
For i:=1 to 64 do begin
If KOITable[i]=ch1 then begin
KOI2WIN:=WINtable[i];
exit;
end;
end;
KOI2WIN:=ch1;
end;
Function MAC2ALT(Ch1: byte): byte;
Var
i: byte;
begin
For i:=1 to 64 do begin
If MACTable[i]=ch1 then begin
MAC2ALT:=ALTtable[i];
exit;
end;
end;
MAC2ALT:=ch1;
end;
Function MAC2ISO(Ch1: byte): byte;
Var
i: byte;
begin
For i:=1 to 64 do begin
If MACTable[i]=ch1 then begin
MAC2ISO:=ISOtable[i];
exit;
end;
end;
MAC2ISO:=ch1;
end;
Function MAC2KOI(Ch1: byte): byte;
Var
i: byte;
begin
For i:=1 to 64 do begin
If MACTable[i]=ch1 then begin
MAC2KOI:=KOItable[i];
exit;
end;
end;
MAC2KOI:=ch1;
end;
Function MAC2WIN(Ch1: byte): byte;
Var
i: byte;
begin
For i:=1 to 64 do begin
If MACTable[i]=ch1 then begin
MAC2WIN:=WINtable[i];
exit;
end;
end;
MAC2WIN:=ch1;
end;
Function WIN2ALT(Ch1: byte): byte;
Var
i: byte;
begin
For i:=1 to 64 do begin
If WINTable[i]=ch1 then begin
WIN2ALT:=ALTtable[i];
exit;
end;
end;
WIN2ALT:=ch1;
end;
Function WIN2ISO(Ch1: byte): byte;
Var
i: byte;
begin
For i:=1 to 64 do begin
If WINTable[i]=ch1 then begin
WIN2ISO:=ISOtable[i];
exit;
end;
end;
WIN2ISO:=ch1;
end;
Function WIN2KOI(Ch1: byte): byte;
Var
i: byte;
begin
For i:=1 to 64 do begin
If WINTable[i]=ch1 then begin
WIN2KOI:=KOItable[i];
exit;
end;
end;
WIN2KOI:=ch1;
end;
Function WIN2MAC(Ch1: byte): byte;
Var
i: byte;
begin
For i:=1 to 64 do begin
If WINTable[i]=ch1 then begin
WIN2MAC:=MACtable[i];
exit;
end;
end;
WIN2MAC:=ch1;
end;
Function ConvertString(InputString: string; Convert_Flag: byte): string;
Var
i: word;
ConvertByte: byte;
begin
ConvertString:='';
If InputString='' then exit;
for i:=1 to length(InputString) do begin
ConvertByte:=ord(InputString[i]);
Case Convert_Flag of
ALT_2_ISO: ConvertByte:=Alt2Iso(ConvertByte);
ALT_2_KOI: ConvertByte:=Alt2Koi(ConvertByte);
ALT_2_MAC: ConvertByte:=Alt2Mac(ConvertByte);
ALT_2_WIN: ConvertByte:=Alt2Win(ConvertByte);
ISO_2_ALT: ConvertByte:=Iso2Alt(ConvertByte);
ISO_2_KOI: ConvertByte:=Iso2Koi(ConvertByte);
ISO_2_MAC: ConvertByte:=Iso2Mac(ConvertByte);
ISO_2_WIN: ConvertByte:=Iso2Win(ConvertByte);
KOI_2_ALT: ConvertByte:=Koi2Alt(ConvertByte);
KOI_2_ISO: ConvertByte:=Koi2Iso(ConvertByte);
KOI_2_MAC: ConvertByte:=Koi2Mac(ConvertByte);
KOI_2_WIN: ConvertByte:=Koi2Win(ConvertByte);
MAC_2_ALT: ConvertByte:=Mac2Alt(ConvertByte);
MAC_2_ISO: ConvertByte:=Mac2Iso(ConvertByte);
MAC_2_KOI: ConvertByte:=Mac2Koi(ConvertByte);
MAC_2_WIN: ConvertByte:=Mac2Win(ConvertByte);
WIN_2_ALT: ConvertByte:=Win2Alt(ConvertByte);
WIN_2_ISO: ConvertByte:=Win2Iso(ConvertByte);
WIN_2_KOI: ConvertByte:=Win2Koi(ConvertByte);
WIN_2_MAC: ConvertByte:=Win2Mac(ConvertByte);
end;
InputString[i]:=chr(ConvertByte);
end;
ConvertString:=InputString;
end;
begin
end.
//---End of Unit RusChar
---
<P></P>
<A HREF="#conten"><FONT COLOR="666666">Вернуться наверх</FONT></A>
<!--- End track --->
<P></P>
<HR><A NAME="_2"></A>
Вариант №2 (21.01.00) Автор: <A HREF="mailto:VUK@fcenter.ru">Алексей Вуколов</A>
<P></P>
Этот вариант несколько более
длинный (в плане размера таблиц перекодировки), но зато, как мне кажется,
более универсальный (и, возможно, более быстрый).
for i := 1 to Length(Str) do
begin
Index := -1;
for j := Low(Win) to High(Win) do
if Win[j] = Str[i] then
begin
Index := j;
Break;
end;
if Index = -1 then Result := Result + Str[i]
else Result := Result + Koi[Index];
end;
end;
<FONT COLOR="#000099">//---------------------------------------------------------------------------</FONT>
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;
<FONT COLOR="#000099">//---------------------------------------------------------------------------</FONT>
procedure SendFileOnSMTP(Host: String;
Port: Integer;
Subject,
FromAddress, ToAddress,
Body,
FileName: String);
var
NMSMTP: TNMSMTP;
begin
if DelSpace(ToAddress) = '' then Exit;
if ToAddress[1] = ';' then Exit;
if (DelSpace(FileName) <> '') and not FileExists(FileName) then
raise Exception.Create('SendFileOnSMTP: file not exist: ' + FileName);
Очень нужна ваша помощь, мальчики. При приемё e-mail сообщения через NMPOP3 на Delphi 4 возникает проблема: русский текст не читается. Что нужно вписать в программу, чтобы он читался? Если не сложно, напишите здесь, поиском и help'ом я уже пользовалась.
Заранее спасибо :)
уже сказано - см. хидер письма + таблицы перекодировки (см. внутри)28.11.01 22:57 Автор: free Статус: Незарегистрированный пользователь
# возращает перекодированную переменную, вызов wintokoi(<переменная>)
sub wintokoi {
my $pvdcoderwin=shift;
$pvdcoderwin=~ tr/\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD7\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xFF/\xE1\xE2\xF7\xE7\xE4\xE5\xF6\xFA\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF2\xF3\xF4\xF5\xE6\xE8\xE3\xFE\xFB\xFD\xFF\xF9\xF8\xFC\xE0\xF1\xC1\xC2\xD7\xC7\xC4\xC5\xD6\xDA\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD2\xD3\xD4\xD5\xC6\xC8\xC3\xDE\xDB\xDD\xDF\xD9\xD8\xDC\xC0\xD1/;
return $pvdcoderwin;
}
sub koitowin {
my $pvdcoderwin=shift;
$pvdcoderwin=~ tr/\xE1\xE2\xF7\xE7\xE4\xE5\xF6\xFA\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF2\xF3\xF4\xF5\xE6\xE8\xE3\xFE\xFB\xFD\xFF\xF9\xF8\xFC\xE0\xF1\xC1\xC2\xD7\xC7\xC4\xC5\xD6\xDA\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD2\xD3\xD4\xD5\xC6\xC8\xC3\xDE\xDB\xDD\xDF\xD9\xD8\xDC\xC0\xD1/\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD7\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xFF/;
return $pvdcoderwin;
}
# возращает перекодированную переменную, вызов wintoiso(<переменная>)
sub wintoiso {
my $pvdcoderiso=shift;
$pvdcoderiso=~ tr/\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD7\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xFF/\xB0\xB1\xB2\xB3\xB4\xB5\xB6\xB7\xB8\xB9\xBA\xBB\xBC\xBD\xBE\xBF\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD7\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF/;
return $pvdcoderiso;
}
sub isotowin {
my $pvdcoderiso=shift;
$pvdcoderiso=~ tr/\xB0\xB1\xB2\xB3\xB4\xB5\xB6\xB7\xB8\xB9\xBA\xBB\xBC\xBD\xBE\xBF\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD7\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF/\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD7\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xFF/;
return $pvdcoderiso;
}
# возращает перекодированную переменную, вызов wintodos(<переменная>)
sub wintodos {
my $pvdcoderdos=shift;
$pvdcoderdos=~ tr/\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD7\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xFF/\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F\xA0\xA1\xA2\xA3\xA4\xA5\xA6\xA7\xA8\xA9\xAA\xAB\xAC\xAD\xAE\xAF\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF/;
return $pvdcoderdos;
}
sub dostowin {
my $pvdcoderdos=shift;
$pvdcoderdos=~ tr/\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F\xA0\xA1\xA2\xA3\xA4\xA5\xA6\xA7\xA8\xA9\xAA\xAB\xAC\xAD\xAE\xAF\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF/\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD7\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xFF/;
return $pvdcoderdos;
}
уже сказано - см. хидер письма + таблицы перекодировки (см. внутри)09.12.01 02:37 Автор: Ммарина. Статус: Незарегистрированный пользователь
Это очень просто - смотришь в какой кодировке пришло сообщение (как это сделать в delphi - я не знаю),
и начинаешь перекодировать символы сообщения из этой кодировки в кодировку windows-1251.
для этого понадобится завести массивы длины 64 символа (или двумерный массив в котором строки - массивы из 64 символов - буквы которые нужно перекодировать, а столбцы - кодировка (dos,iso,koi8 и т.д.))
(потому что в русском алфавите 32 буквы, если я не ошибаюсь),
а символы брать из таблиц перекодировки, которую я привел выше
(это строка вида \хYY - это символ в определенной кодировке, записаный в 16-ричном формате, соответственно для каждой кодировки есть символ, в windows-1251, в который он должен быть преобразован).
чтобы было более понятно - tr/ \xYY / \xZZ /;
- это регулярное выражение perl'а (читай - функция в delphi), которое на место символа с 16ричным кодом YY ставит символ с 16ричным кодом ZZ
Лобовое решение - очевидно.
Если лень самой строить таблицы перекодировок, найди сайт "Королевство Дельфи" - прямо и введи такую строку в любой поисковой системе.
Не читается ни в одной кодировке(win koi)?27.11.01 17:23 Автор: Cyril <sc> Статус: Member
Если письмо на английском языке, читается нормально. На русском же - не читается. Важно, чтобы программа сама определяла русский текст, без посторонней помощи.
Поизучай заголовок письма28.11.01 16:04 Автор: Cyril <sc> Статус: Member
> Если письмо на английском языке, читается нормально. На > русском же - не читается. Важно, чтобы программа сама > определяла русский текст, без посторонней помощи.
Попробуй выведи эту строчку на экран и посмотри кодировку в которой
приходит письмо
NMPOP.MailMessage.ContentType
должно быть что-то похожее на эту строку
Content-Type: text/plain; charset=koi8-r
ну а в зависимости от charset преобразуй текст для вывода на экран
> > Если письмо на английском языке, читается нормально. > На > > русском же - не читается. Важно, чтобы программа сама > > определяла русский текст, без посторонней помощи. > > Попробуй выведи эту строчку на экран и посмотри кодировку в > которой > приходит письмо > > NMPOP.MailMessage.ContentType > > должно быть что-то похожее на эту строку > Content-Type: text/plain; charset=koi8-r > ну а в зависимости от charset преобразуй текст для вывода > на экран
Такой возможности нет. В NMPOP3.MailMessage*нет ContentType. :( Delphi 4.
Да, действительно, в D4 этого нет, сорри30.11.01 12:20 Автор: Cyril <sc> Статус: Member
> Такой возможности нет. В NMPOP3.MailMessage*нет > ContentType. :( Delphi 4.
NMPOP3.MailMessage.Head - заголовок письма
ContentType - просто более удобный способ получения информации о типе содержимого письма(есть в D5), но все это можно найти в заголовке письма(Head)
Applies to
TMailMessage object
Declaration
property Head: TExStringList;
Description
The Head property contains the header of the current mail message.
свойство Head содержит заголовок текущего сообщения
> > Такой возможности нет. В NMPOP3.MailMessage*нет > > ContentType. :( Delphi 4. > > NMPOP3.MailMessage.Head - заголовок письма > ContentType - просто более удобный способ получения > информации о типе содержимого письма(есть в D5), но все это > можно найти в заголовке письма(Head) > > Applies to > TMailMessage object > > Declaration > property Head: TExStringList; > > Description > The Head property contains the header of the current mail > message. > свойство Head содержит заголовок текущего сообщения > > Accessability: Runtime, Read-only
И что с ним делать? Как же получить письмо в правильной кодировке? Куда вписать "Head"? Может быть, пример напишете?:)
<TITLE>«Королевство Dельфи» Виртуальный клуб программистов</TITLE>
<META NAME="keywords" CONTENT="delphi programmer programm programming
club delphi hint дельфи программист программирование программа виртуальный
клуб дельфи советы компоненты взаимопомощь дельфи delphi">
<META NAME="description" CONTENT="Delphi Programmer Club. Using hints.
Виртуальный клуб программистов на Дельфи. Использование всплывающих подсказок">
const
Koi =
'юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ';
Win =
'бвчздецъйклмнопртуфхжигюыэящшьасБВЧЗДЕЦЪЙКЛМНОПРТУФХЖИГЮЫЭЯЩШЬАС';
SerH = 'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ';
SerL = 'абвгдежзийклмнопрстуфхцчшщъыьэюя';
procedure ANSI2KOI(var Str: string);
var i: integer; k: byte;
begin
for i := 1 to Length(Str) do begin
k := byte(Str[i]);
if k = $B8 then Str[i] := char($A3) else
if k = $A8 then Str[i] := char($B3) else
if k > $BF then Str[i] := Win[k - $BF];
end;
end;
procedure KOI2ANSI(var Str: string);
var i: integer; k: byte;
begin
for i := 1 to Length(Str) do begin
k := byte(Str[i]);
if k = $A3 then Str[i] := 'ё' else
if k = $B3 then Str[i] := 'Ё' else
if k > $BF then Str[i] := Koi[k - $BF];
end;
end;
procedure ANSI2IBM(var Str: string);
var i: integer; k: byte;
begin
for i := 1 to Length(Str) do begin
k := byte(Str[i]);
if k = $B8 then Str[i] := char($F1) else
if k = $A8 then Str[i] := char($F0) else
if k > $EF then Str[i] := char(k - 16) else
if (k > $BF) and (k < $F0) then Str[i] := char(k - 64);
end;
end;
procedure IBM2ANSI(var Str: string);
var i: integer; k: byte;
begin
for i := 1 to Length(Str) do begin
k := byte(Str[i]);
if k = $F0 then Str[i] := 'Ё' else
if k = $F1 then Str[i] := 'ё' else
if (k > $7F) and (k < $A0) then Str[i] := SerH[k - $7F] else
if (k > $9F) and (k < $B0) then Str[i] := SerL[k - $9F] else
if (k > $DF) and (k < $F0) then Str[i] := SerL[k - $CF];
end;
end;
procedure ANSI2Mac(var Str: string);
var i: integer; k: byte;
begin
for i := 1 to Length(Str) do begin
k := byte(Str[i]);
if k = $A8 then Str[i] := char($DD) else
if k = $B8 then Str[i] := char($DE) else
if k = $FF then Str[i] := char($DF) else
if (k > $BF) and (k < $E0) then Str[i] := char(k - 64);
end;
end;
procedure Mac2ANSI(var Str: string);
var i: integer; k: byte;
begin
for i := 1 to Length(Str) do begin
k := byte(Str[i]);
if k = $DD then Str[i] := 'Ё' else
if k = $DE then Str[i] := 'ё' else
if k = $DF then Str[i] := 'я' else
if (k > $7F) and (k < $A0) then Str[i] := SerH[k - $7F] else
if (k > $DF) and (k < $FF) then Str[i] := SerL[k - $DF];
end;
end;
procedure ANSI2ISO(var Str: string);
var i: integer; k: byte;
begin
for i := 1 to Length(Str) do begin
k := byte(Str[i]);
if k = $A8 then Str[i] := char($A1) else
if k = $B8 then Str[i] := char($F1) else
if k > $BF then Str[i] := char(k - 16);
end;
end;
procedure ISO2ANSI(var Str: string);
var i: integer; k: byte;
begin
for i := 1 to Length(Str) do begin
k := byte(Str[i]);
if k = $A1 then Str[i] := 'Ё' else
if k = $F1 then Str[i] := 'ё' else
if k < $F0 then begin
if k > $CF then Str[i] := SerL[k - $CF] else
if k > $AF then Str[i] := SerH[k - $AF];
end;
end;
end;
---
<P></P>
<A HREF="#conten"><FONT COLOR="666666">Вернуться наверх</FONT></A>
<!--- End track --->
<P></P>
<HR><A NAME="_3"></A>
Вариант №3 (31.01.00) Автор: <A HREF="mailto:nekhoroshkov@novolabs.ru">Constantin G. Nekhoroshkov</A>
<P></P>
Предлагаю всеобщему вниманию вот такой вот unit. Он решает проблемы
конвертации не только Win1251->KOI8 но и конвертации в другие
кодировки.
//---Begin of Unit RusChar
Unit RusChar;
interface
Function ALT2ISO(Ch1: byte): byte;
Function ALT2KOI(Ch1: byte): byte;
Function ALT2MAC(Ch1: byte): byte;
Function ALT2WIN(Ch1: byte): byte;
Function ISO2ALT(Ch1: byte): byte;
Function ISO2KOI(Ch1: byte): byte;
Function ISO2MAC(Ch1: byte): byte;
Function ISO2WIN(Ch1: byte): byte;
Function KOI2ALT(Ch1: byte): byte;
Function KOI2ISO(Ch1: byte): byte;
Function KOI2MAC(Ch1: byte): byte;
Function KOI2WIN(Ch1: byte): byte;
Function MAC2ALT(Ch1: byte): byte;
Function MAC2ISO(Ch1: byte): byte;
Function MAC2KOI(Ch1: byte): byte;
Function MAC2WIN(Ch1: byte): byte;
Function WIN2ALT(Ch1: byte): byte;
Function WIN2ISO(Ch1: byte): byte;
Function WIN2KOI(Ch1: byte): byte;
Function WIN2MAC(Ch1: byte): byte;
Function ConvertString(InputString: string; Convert_Flag: byte): string;
implementation
Const
//Alt decode contants
ALT_2_ISO=1;
ALT_2_KOI=2;
ALT_2_MAC=3;
ALT_2_WIN=4;
//Iso decode contants
ISO_2_ALT=5;
ISO_2_KOI=6;
ISO_2_MAC=7;
ISO_2_WIN=8;
//Koi decode contants
KOI_2_ALT=9;
KOI_2_ISO=10;
KOI_2_MAC=11;
KOI_2_WIN=12;
//Mac decode contants
MAC_2_ALT=13;
MAC_2_ISO=14;
MAC_2_KOI=15;
MAC_2_WIN=16;
//Win decode contants
WIN_2_ALT=17;
WIN_2_ISO=18;
WIN_2_KOI=19;
WIN_2_MAC=20;
ALTTable: array [1..64] of byte =(
128, 129, 130, 131, 132, 133, 134, 135,
136, 137, 138, 139, 140, 141, 142, 143,
144, 145, 146, 147, 148, 149, 150, 151,
152, 153, 154, 155, 156, 157, 158, 159,
160, 161, 162, 163, 164, 165, 166, 167,
168, 169, 170, 171, 172, 173, 174, 175,
224, 225, 226, 227, 228, 229, 230, 231,
232, 233, 234, 235, 236, 237, 238, 239
);
ISOTable: array [1..64] of byte =(
176, 177, 178, 179, 180, 181, 182, 183,
184, 185, 186, 187, 188, 189, 190, 191,
192, 193, 194, 195, 196, 197, 198, 199,
200, 201, 202, 203, 204, 205, 206, 207,
208, 209, 210, 211, 212, 213, 214, 215,
216, 217, 218, 219, 220, 221, 222, 223,
224, 225, 226, 227, 228, 229, 230, 231,
232, 233, 234, 235, 236, 237, 238, 239
);
KOITable: array [1..64] of byte =(
225, 226, 247, 231, 228, 229, 246, 250,
233, 234, 235, 236, 237, 238, 239, 240,
242, 243, 244, 245, 230, 232, 227, 254,
251, 253, 255, 249, 248, 252, 224, 241,
193, 194, 215, 199, 196, 197, 214, 218,
201, 202, 203, 204, 205, 206, 207, 208,
210, 211, 212, 213, 198, 200, 195, 222,
219, 221, 223, 217, 216, 220, 192, 209
);
MACTable: array [1..64] of byte =(
128, 129, 130, 131, 132, 133, 134, 135,
136, 137, 138, 139, 140, 141, 142, 143,
144, 145, 146, 147, 148, 149, 150, 151,
152, 153, 154, 155, 156, 157, 158, 159,
224, 225, 226, 227, 228, 229, 230, 231,
232, 233, 234, 235, 236, 237, 238, 239,
240, 241, 242, 243, 244, 245, 246, 247,
248, 249, 250, 251, 252, 253, 254, 223
);
WINTable: array [1..64] of byte =(
192, 193, 194, 195, 196, 197, 198, 199,
200, 201, 202, 203, 204, 205, 206, 207,
208, 209, 210, 211, 212, 213, 214, 215,
216, 217, 218, 219, 220, 221, 222, 223,
224, 225, 226, 227, 228, 229, 230, 231,
232, 233, 234, 235, 236, 237, 238, 239,
240, 241, 242, 243, 244, 245, 246, 247,
248, 249, 250, 251, 252, 253, 254, 255
);
Function ALT2ISO(Ch1: byte): byte;
Var
i: byte;
begin
For i:=1 to 64 do begin
If ALTTable[i]=ch1 then begin
ALT2ISO:=ISOtable[i];
exit;
end;
end;
ALT2ISO:=ch1;
end;
Function ALT2KOI(Ch1: byte): byte;
Var
i: byte;
begin
For i:=1 to 64 do begin
If ALTTable[i]=ch1 then begin
ALT2KOI:=KOItable[i];
exit;
end;
end;
ALT2KOI:=ch1;
end;
Function ALT2MAC(Ch1: byte): byte;
Var
i: byte;
begin
For i:=1 to 64 do begin
If ALTTable[i]=ch1 then begin
ALT2MAC:=MACtable[i];
exit;
end;
end;
ALT2MAC:=ch1;
end;
Function ALT2WIN(Ch1: byte): byte;
Var
i: byte;
begin
For i:=1 to 64 do begin
If ALTTable[i]=ch1 then begin
ALT2WIN:=WINtable[i];
exit;
end;
end;
ALT2WIN:=ch1;
end;
Function ISO2ALT(Ch1: byte): byte;
Var
i: byte;
begin
For i:=1 to 64 do begin
If ISOTable[i]=ch1 then begin
ISO2ALT:=ALTtable[i];
exit;
end;
end;
ISO2ALT:=ch1;
end;
Function ISO2KOI(Ch1: byte): byte;
Var
i: byte;
begin
For i:=1 to 64 do begin
If ISOTable[i]=ch1 then begin
ISO2KOI:=KOItable[i];
exit;
end;
end;
ISO2KOI:=ch1;
end;
Function ISO2MAC(Ch1: byte): byte;
Var
i: byte;
begin
For i:=1 to 64 do begin
If ISOTable[i]=ch1 then begin
ISO2MAC:=MACtable[i];
exit;
end;
end;
ISO2MAC:=ch1;
end;
Function ISO2WIN(Ch1: byte): byte;
Var
i: byte;
begin
For i:=1 to 64 do begin
If ISOTable[i]=ch1 then begin
ISO2WIN:=WINtable[i];
exit;
end;
end;
ISO2WIN:=ch1;
end;
Function KOI2ALT(Ch1: byte): byte;
Var
i: byte;
begin
For i:=1 to 64 do begin
If KOITable[i]=ch1 then begin
KOI2ALT:=ALTtable[i];
exit;
end;
end;
KOI2ALT:=ch1;
end;
Function KOI2ISO(Ch1: byte): byte;
Var
i: byte;
begin
For i:=1 to 64 do begin
If KOITable[i]=ch1 then begin
KOI2ISO:=ISOtable[i];
exit;
end;
end;
KOI2ISO:=ch1;
end;
Function KOI2MAC(Ch1: byte): byte;
Var
i: byte;
begin
For i:=1 to 64 do begin
If KOITable[i]=ch1 then begin
KOI2MAC:=MACtable[i];
exit;
end;
end;
KOI2MAC:=ch1;
end;
Function KOI2WIN(Ch1: byte): byte;
Var
i: byte;
begin
For i:=1 to 64 do begin
If KOITable[i]=ch1 then begin
KOI2WIN:=WINtable[i];
exit;
end;
end;
KOI2WIN:=ch1;
end;
Function MAC2ALT(Ch1: byte): byte;
Var
i: byte;
begin
For i:=1 to 64 do begin
If MACTable[i]=ch1 then begin
MAC2ALT:=ALTtable[i];
exit;
end;
end;
MAC2ALT:=ch1;
end;
Function MAC2ISO(Ch1: byte): byte;
Var
i: byte;
begin
For i:=1 to 64 do begin
If MACTable[i]=ch1 then begin
MAC2ISO:=ISOtable[i];
exit;
end;
end;
MAC2ISO:=ch1;
end;
Function MAC2KOI(Ch1: byte): byte;
Var
i: byte;
begin
For i:=1 to 64 do begin
If MACTable[i]=ch1 then begin
MAC2KOI:=KOItable[i];
exit;
end;
end;
MAC2KOI:=ch1;
end;
Function MAC2WIN(Ch1: byte): byte;
Var
i: byte;
begin
For i:=1 to 64 do begin
If MACTable[i]=ch1 then begin
MAC2WIN:=WINtable[i];
exit;
end;
end;
MAC2WIN:=ch1;
end;
Function WIN2ALT(Ch1: byte): byte;
Var
i: byte;
begin
For i:=1 to 64 do begin
If WINTable[i]=ch1 then begin
WIN2ALT:=ALTtable[i];
exit;
end;
end;
WIN2ALT:=ch1;
end;
Function WIN2ISO(Ch1: byte): byte;
Var
i: byte;
begin
For i:=1 to 64 do begin
If WINTable[i]=ch1 then begin
WIN2ISO:=ISOtable[i];
exit;
end;
end;
WIN2ISO:=ch1;
end;
Function WIN2KOI(Ch1: byte): byte;
Var
i: byte;
begin
For i:=1 to 64 do begin
If WINTable[i]=ch1 then begin
WIN2KOI:=KOItable[i];
exit;
end;
end;
WIN2KOI:=ch1;
end;
Function WIN2MAC(Ch1: byte): byte;
Var
i: byte;
begin
For i:=1 to 64 do begin
If WINTable[i]=ch1 then begin
WIN2MAC:=MACtable[i];
exit;
end;
end;
WIN2MAC:=ch1;
end;
Function ConvertString(InputString: string; Convert_Flag: byte): string;
Var
i: word;
ConvertByte: byte;
begin
ConvertString:='';
If InputString='' then exit;
for i:=1 to length(InputString) do begin
ConvertByte:=ord(InputString[i]);
Case Convert_Flag of
ALT_2_ISO: ConvertByte:=Alt2Iso(ConvertByte);
ALT_2_KOI: ConvertByte:=Alt2Koi(ConvertByte);
ALT_2_MAC: ConvertByte:=Alt2Mac(ConvertByte);
ALT_2_WIN: ConvertByte:=Alt2Win(ConvertByte);
ISO_2_ALT: ConvertByte:=Iso2Alt(ConvertByte);
ISO_2_KOI: ConvertByte:=Iso2Koi(ConvertByte);
ISO_2_MAC: ConvertByte:=Iso2Mac(ConvertByte);
ISO_2_WIN: ConvertByte:=Iso2Win(ConvertByte);
KOI_2_ALT: ConvertByte:=Koi2Alt(ConvertByte);
KOI_2_ISO: ConvertByte:=Koi2Iso(ConvertByte);
KOI_2_MAC: ConvertByte:=Koi2Mac(ConvertByte);
KOI_2_WIN: ConvertByte:=Koi2Win(ConvertByte);
MAC_2_ALT: ConvertByte:=Mac2Alt(ConvertByte);
MAC_2_ISO: ConvertByte:=Mac2Iso(ConvertByte);
MAC_2_KOI: ConvertByte:=Mac2Koi(ConvertByte);
MAC_2_WIN: ConvertByte:=Mac2Win(ConvertByte);
WIN_2_ALT: ConvertByte:=Win2Alt(ConvertByte);
WIN_2_ISO: ConvertByte:=Win2Iso(ConvertByte);
WIN_2_KOI: ConvertByte:=Win2Koi(ConvertByte);
WIN_2_MAC: ConvertByte:=Win2Mac(ConvertByte);
end;
InputString[i]:=chr(ConvertByte);
end;
ConvertString:=InputString;
end;
begin
end.
//---End of Unit RusChar
---
<P></P>
<A HREF="#conten"><FONT COLOR="666666">Вернуться наверх</FONT></A>
<!--- End track --->
<P></P>
<HR><A NAME="_2"></A>
Вариант №2 (21.01.00) Автор: <A HREF="mailto:VUK@fcenter.ru">Алексей Вуколов</A>
<P></P>
Этот вариант несколько более
длинный (в плане размера таблиц перекодировки), но зато, как мне кажется,
более универсальный (и, возможно, более быстрый).
for i := 1 to Length(Str) do
begin
Index := -1;
for j := Low(Win) to High(Win) do
if Win[j] = Str[i] then
begin
Index := j;
Break;
end;
if Index = -1 then Result := Result + Str[i]
else Result := Result + Koi[Index];
end;
end;
<FONT COLOR="#000099">//---------------------------------------------------------------------------</FONT>
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;
<FONT COLOR="#000099">//---------------------------------------------------------------------------</FONT>
procedure SendFileOnSMTP(Host: String;
Port: Integer;
Subject,
FromAddress, ToAddress,
Body,
FileName: String);
var
NMSMTP: TNMSMTP;
begin
if DelSpace(ToAddress) = '' then Exit;
if ToAddress[1] = ';' then Exit;
if (DelSpace(FileName) <> '') and not FileExists(FileName) then
raise Exception.Create('SendFileOnSMTP: file not exist: ' + FileName);