Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение Subject письма в кодировке koi8-r, Как правильно декодировать? 
:(
    Опции темы
sg729
  Дата 19.2.2010, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 17.5.2009

Репутация: 1
Всего: 1



Имеется строка из subject письма. В OutlookExpress subject читабельный. Если я правильно понимаю, вначале нужно декодировать из Base64, а затем преобразовать koi8-r -> ansi ?
Пробовал разные примеры, перерыл форум - ничего не получается.

исходная строка из письма например такая:
=?koi8-r?Q?WMJ.ru-=D2=C5=C3=C5=D0=D4=D9:  =EE=C5=CF=C2=D9=DE=CE=CF=C5 =D0=CF=D3=D4=CE=CF=C5  =CD=C5=CE=C0!  ?=
после декодирования base64:
ÿù(‹ÿëý?Ö0¿ë¿ÿÃ
после koi8-r -> ansi :
ÚÛ(‹ÚÊÙ?æ0¹Ê¹Úö

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdCoder, IdCoder3to4, IdCoderMIME,
  ConvertEncodingUnit;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Button1: TButton;
    IdDecoderMIME1: TIdDecoderMIME;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  TConvertChars = array [#128..#255] of char;
  
const
  Win_KoiChars: TConvertChars = (
  #128,#129,#130,#131,#132,#133,#134,#135,#136,#137,#060,#139,#140,#141,#142,#143,
  #144,#145,#146,#147,#148,#169,#150,#151,#152,#153,#154,#062,#176,#157,#183,#159,
  #160,#246,#247,#074,#164,#231,#166,#167,#179,#169,#180,#060,#172,#173,#174,#183,
  #156,#177,#073,#105,#199,#181,#182,#158,#163,#191,#164,#062,#106,#189,#190,#167,
  #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,#154,#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);

  Koi_WinChars: TConvertChars = (
  #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,#218,#155,#176,#157,#183,#159,
  #160,#161,#162,#184,#186,#165,#166,#191,#168,#169,#170,#171,#172,#173,#174,#175,
  #156,#177,#178,#168,#170,#181,#182,#175,#184,#185,#186,#187,#188,#189,#190,#185,
  #254,#224,#225,#246,#228,#229,#244,#227,#245,#232,#233,#234,#235,#236,#237,#238,
  #239,#255,#240,#241,#242,#243,#230,#226,#252,#251,#231,#248,#253,#249,#247,#250,
  #222,#192,#193,#214,#196,#197,#212,#195,#213,#200,#201,#202,#203,#204,#205,#206,
  #207,#223,#208,#209,#210,#211,#198,#194,#220,#219,#199,#216,#221,#217,#215,#218);

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

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

var
  Form1: TForm1;

implementation

{$R *.dfm}


{ **** UBPFD *********** by delphibase.endimus.com ****
>> ïåðåêîäèðîâêà ñòðîê èç îäíîé êîäèðîâêè â äðóãóþ
Çàâèñèìîñòè: Íåò
Àâòîð:       default
Copyright:   default(+VEG@-èå âåêòîðà ïåðåêîäèðîâîê)
Äàòà:        3 íîÿáðÿ 2003 ã.
***************************************************** }

function CodeConversion(const SourceStr, VectorCodeConv: PChar): PChar;
asm
        // Âõîä: SourceStr --> EAX, VectorCodeConv --> EDX
        // Âûõîä: Result --> EAX

        PUSH EBX
        XOR ECX, ECX
        XOR EBX, EBX
@@Go:
        TEST BYTE PTR [EAX + ECX], -1
        JZ @@Exit
        MOV BL, BYTE PTR [EAX + ECX]
        MOV BL, BYTE PTR [EDX + EBX - 1]
        MOV BYTE PTR [EAX + ECX], BL
        INC ECX
        JMP @@Go
@@Exit:
        POP EBX

end;


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;


function Koi_WinConvert(const St: string): string;
var
  i: integer;
begin
  Result:=St;
  for i:=1 to Length(St) do
    if St[i]>#127 then
      Result[i]:=Koi_WinChars[St[i]];
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  s1, s2, s3: String;
begin
  s1:=Edit1.Text;
  s2:=IdDecoderMIME1.DecodeString(s1);
  Edit2.Text:=s2;

//  s3:=CodeConversion(PChar(s2), cmKoi8RToAnsi);
//  s3:=ConvertEncoding(s2,'cmKoi8RToAnsi');
//  s3:=KoiToWin(s2);
  s3:=Koi_WinConvert(s2);

  Edit3.Text:=s3;
end;

end.


в чем моя ошибка ?

Это сообщение отредактировал(а) sg729 - 19.2.2010, 15:15
PM MAIL   Вверх
Snowy
Дата 19.2.2010, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Цитата(sg729 @  19.2.2010,  15:08 Найти цитируемый пост)
исходная строка из письма например такая:=?koi8-r?Q?WMJ.ru-=D2=C5=C3=C5=D0=D4=D9:  =EE=C5=CF=C2=D9=DE=CE=CF=C5 =D0=CF=D3=D4=CE=CF=C5  =CD=C5=CE=C0!  ?=
Если аутглюк умеет такое читать, значит у него низкаю чувствительность к ошибкам - умеет выбрасывать мусор.
А вообще, такое издевательство над стандартом и не должно читаться.
Это ж как нужно было кодировать, чтоб такое получилось. Вручную, что ли собирали...
Наверное через китайский сервер, где китайцы вручную кодируют...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0590 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.