powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Трудности перевода... Или как корректно раскодировать header.subject в Synapse
16 сообщений из 16, страница 1 из 1
Трудности перевода... Или как корректно раскодировать header.subject в Synapse
    #40036135
Softologic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!
Применяю Synapse для декодирования сообщений электронной почты. В целом все норм, но порой он не очень корректно конвертирует именно тему письма, а совсем редко, но ошибается и с кодировкой тела письма.
Сейчас острее стоит проблема именно с темой. Если подробнее - в веб-почте все норм: "Fw: ειδωλον философы", а после обработки в методе InlineDecode модуля mimeinln, строка превращается в: "Fw: _______ философы" (вопросы или нижнее подчеркивание). Проблема возникает в строке конверсии s := CharsetConversion(s, ichar, CP) :
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
function InlineDecode(const Value: string; CP: TMimeChar): string;
var
  s, su, v: string;
  x, y, z, n: Integer;
  ichar: TMimeChar;
  c: Char;

  function SearchEndInline(const Value: string; be: Integer): Integer;
  var
    n, q: Integer;
  begin
    q := 0;
    Result := 0;
    for n := be + 2 to Length(Value) - 1 do
      if Value[n] = '?' then
      begin
        Inc(q);
        if (q > 2) and (Value[n + 1] = '=') then
        begin
          Result := n;
          Break;
        end;
      end;
  end;

begin
  Result := '';
  v := Value;
  x := Pos('=?', v);
  y := SearchEndInline(v, x);
  //fix for broken coding with begin, but not with end.
  if (x > 0) and (y <= 0) then
    y := Length(Result);
  while (y > x) and (x > 0) do
  begin
    s := Copy(v, 1, x - 1);
    if Trim(s) <> '' then
      Result := Result + s;
    s := Copy(v, x, y - x + 2);
    Delete(v, 1, y + 1);
    su := Copy(s, 3, Length(s) - 4);
    z := Pos('?', su);
    if (Length(su) >= (z + 2)) and (su[z + 2] = '?') then
    begin
      ichar := GetCPFromID(SeparateLeft(Copy(su, 1, z - 1), '*'));
      c := UpperCase(su)[z + 1];
      su := Copy(su, z + 3, Length(su) - z - 2);
      if c = 'B' then
      begin
        s := DecodeBase64(su);
        s := CharsetConversion(s, ichar, CP);
      end;
      if c = 'Q' then
      begin
        s := '';
        for n := 1 to Length(su) do
          if su[n] = '_' then
            s := s + ' '
          else
            s := s + su[n];
        s := DecodeQuotedPrintable(s);
// ichar = utf_8, cp = cp1251
        s := CharsetConversion(s, ichar, CP);
      end;
    end;
    Result := Result + s;
    x := Pos('=?', v);
    y := SearchEndInline(v, x);
  end;
  Result := Result + v;
end;


Предыдущая строка s := DecodeQuotedPrintable(s) отрабатывает корректно. Проверил получившуюся строку через онлайн-конвертор, который определил автоматически преобразование из windows-1251 в utf-8: http://www.online-decoder.com/ru. И в итоге выдав верное значение: "Fw: ειδωλον философы".

Пробовал различные методы от TEncode (у меня XE7 и D10.2 Токио), но нужного результата не получил. Есть какие то идеи как заменить CharsetConversion(s, ichar, CP) ?
...
Рейтинг: 0 / 0
Трудности перевода... Или как корректно раскодировать header.subject в Synapse
    #40036138
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SoftologicЕсли подробнее - в веб-почте все норм:

Забей на веб-почту, посмотри прямо в исходник заголовков письма. Потом на этой строке
сможешь отлаживаться. Может, там RFC вообще нарушено или строка кодировки не в списке синапса.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Трудности перевода... Или как корректно раскодировать header.subject в Synapse
    #40036140
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Softologic
веб-почте все норм: "Fw: ειδωλον философы", а после обработки в методе InlineDecode модуля mimeinln, строка превращается в: "Fw: _______ философы"


Ну так не обрабатывай "в методе InlineDecode". Оставь так, как было до обработки.
...
Рейтинг: 0 / 0
Трудности перевода... Или как корректно раскодировать header.subject в Synapse
    #40036152
Softologic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот изначальная строка, еще до s := DecodeBase64(su):
'=?utf-8?B?Rnc6IM61zrnOtM+JzrvOv869INGE0LjQu9C+0YHQvtGE0Ys=?='
...
Рейтинг: 0 / 0
Трудности перевода... Или как корректно раскодировать header.subject в Synapse
    #40036159
Softologic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ъъъъъ
Softologic
веб-почте все норм: "Fw: ειδωλον философы", а после обработки в методе InlineDecode модуля mimeinln, строка превращается в: "Fw: _______ философы"


Ну так не обрабатывай "в методе InlineDecode". Оставь так, как было до обработки.

Так если не обрабатывать, то после декодирования base64 она превращается в : 'Fw: ОµО№ОґП‰О»ОїОЅ философы'
...
Рейтинг: 0 / 0
Трудности перевода... Или как корректно раскодировать header.subject в Synapse
    #40036166
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Softologic
Так если не обрабатывать, то после декодирования base64 она превращается в : 'Fw: ОµО№ОґП‰О»ОїОЅ философы'
Неправильно декодируете Здесь все замечательно декодируется.

Вы понимаете, что декодинг из base64 дает бинарные данные.

У вас должен быть такой код
Код: pascal
1.
2.
3.
4.
5.
6.
7.
var
  LBytes: TBytes;
  LStr: string;
begin
  LBytes := Base64Decode(...);
  LStr := TEncoding.UTF8.GetString(LBytes);
end;

Какой именно TEncoding использовать определяется отдельно.
...
Рейтинг: 0 / 0
Трудности перевода... Или как корректно раскодировать header.subject в Synapse
    #40036168
Softologic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Собственно задача то в том, чтобы "Fw: ОµО№ОґП‰О»ОїОЅ философы" замастырить в "Fw: ειδωλον философы" каким то образом, но я не особо в кодировках и методах пока понимаю.. Недавно только начал миграцию проектов с Delphi7 на XE7 и Токио.
...
Рейтинг: 0 / 0
Трудности перевода... Или как корректно раскодировать header.subject в Synapse
    #40036179
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Softologic
Собственно задача то в том, чтобы "Fw: ОµО№ОґП‰О»ОїОЅ философы" замастырить в "Fw: ειδωλον философы"
Задача неправильная. "Fw: ОµО№ОґП‰О»ОїОЅ философы" это уже ошибка. И ее нужно исправлять.

Задача звучит так: трансформировать строку '=?utf-8?B?Rnc6IM61zrnOtM+JzrvOv869INGE0LjQu9C+0YHQvtGE0Ys=?=' в "ειδωλον философы"
...
Рейтинг: 0 / 0
Трудности перевода... Или как корректно раскодировать header.subject в Synapse
    #40036184
Softologic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_
Softologic
Так если не обрабатывать, то после декодирования base64 она превращается в : 'Fw: ОµО№ОґП‰О»ОїОЅ философы'
Неправильно декодируете Здесь все замечательно декодируется.

Вы понимаете, что декодинг из base64 дает бинарные данные.

У вас должен быть такой код
Код: pascal
1.
2.
3.
4.
5.
6.
7.
var
  LBytes: TBytes;
  LStr: string;
begin
  LBytes := Base64Decode(...);
  LStr := TEncoding.UTF8.GetString(LBytes);
end;


Какой именно TEncoding использовать определяется отдельно.

_Vasilisk_,

Теперь все получилось, спасибо за разъяснение!
Проблема в том, что у Синапса в результате декодирования обычный стринг.

Я заменил код Синапса на ваш и все ок:
Код: pascal
1.
2.
3.
4.
        //s := DecodeBase64(su);
        //sf := CharsetConversion(s, ichar, CP);
        b:=TNetEncoding.Base64.DecodeStringToBytes(su);
        sf:=TEncoding.UTF8.GetString(b);
...
Рейтинг: 0 / 0
Трудности перевода... Или как корректно раскодировать header.subject в Synapse
    #40036188
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Softologic
Код: pascal
1.
sf:=TEncoding.UTF8.GetString(b);

Это неправильно. Я же сказал
_Vasilisk_
Какой именно TEncoding использовать определяется отдельно.
...
Рейтинг: 0 / 0
Трудности перевода... Или как корректно раскодировать header.subject в Synapse
    #40036192
Softologic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_
Softologic
Код: pascal
1.
sf:=TEncoding.UTF8.GetString(b);


Это неправильно. Я же сказал
_Vasilisk_
Какой именно TEncoding использовать определяется отдельно.

А определять ее каким образом лучше? Из данной строки, поскольку как мы видим utf-8 здесь присутствует: '=?utf-8?B?Rnc6IM61zrnOtM+JzrvOv869INGE0LjQu9C+0YHQvtGE0Ys=?=' ?
...
Рейтинг: 0 / 0
Трудности перевода... Или как корректно раскодировать header.subject в Synapse
    #40036198
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Softologic
вот изначальная строка, еще до s := DecodeBase64(su):
'=?utf-8?B?Rnc6IM61zrnOtM+JzrvOv869INGE0LjQu9C+0YHQvtGE0Ys=?='

У тебя данные начиная с R.
Попробуй декодировать строку "Rnc6IM61zrnOtM+JzrvOv869INGE0LjQu9C+0YHQvtGE0Ys=?="
...
Рейтинг: 0 / 0
Трудности перевода... Или как корректно раскодировать header.subject в Synapse
    #40036205
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SoftologicА определять ее каким образом лучше?

Единственный правильный способ: прочитать название кодировки после первого знака вопроса.
Оно для того там и написано.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Трудности перевода... Или как корректно раскодировать header.subject в Synapse
    #40036209
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Softologic
А определять ее каким образом лучше? Из данной строки,
Вот из данной строки и определять.

Держите рыбу (не уверен, что в синапсе такого нет)
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
funcdion DecodeString(const AStr: string): string;
var
  LParts: TArray<string>;
  LEncoding: TEncoding;
  LData: TBytes;
  LNeedFree: Boolean;
begin
  if Copy(AStr, 1, 2) <> '=?' then
    Exit(AStr);
  LParts := AStr.Split('?');
  if (Length(LParts) <> 5) or (LParts[4] <> '=') then
    raise Exception.Create('Invalid format');
  if Length(LParts[2]) <> 1 then
    raise Exception.Create('Invalid token encoding');
  case LParts[2][1] of
    'B': LData := Base64Decode(LParts[3]);
    'Q': LData := QuotedPrintableDecode(LParts[3]);
  else
    raise Exception.Create('Invalid token encoding');
  end;
  LEncoding := GetEncoding(LParts[1], LNeedFree);
  try
    Result := LEncoding.GetString(LBytes);
  finally
    if LNeedFree then
      LEncoding.Free;
  end;
end;
...
Рейтинг: 0 / 0
Трудности перевода... Или как корректно раскодировать header.subject в Synapse
    #40036216
Softologic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_
Softologic
А определять ее каким образом лучше? Из данной строки,
Вот из данной строки и определять.

Держите рыбу (не уверен, что в синапсе такого нет)
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
funcdion DecodeString(const AStr: string): string;
var
  LParts: TArray<string>;
  LEncoding: TEncoding;
  LData: TBytes;
  LNeedFree: Boolean;
begin
  if Copy(AStr, 1, 2) <> '=?' then
    Exit(AStr);
  LParts := AStr.Split('?');
  if (Length(LParts) <> 5) or (LParts[4] <> '=') then
    raise Exception.Create('Invalid format');
  if Length(LParts[2]) <> 1 then
    raise Exception.Create('Invalid token encoding');
  case LParts[2][1] of
    'B': LData := Base64Decode(LParts[3]);
    'Q': LData := QuotedPrintableDecode(LParts[3]);
  else
    raise Exception.Create('Invalid token encoding');
  end;
  LEncoding := GetEncoding(LParts[1], LNeedFree);
  try
    Result := LEncoding.GetString(LBytes);
  finally
    if LNeedFree then
      LEncoding.Free;
  end;
end;



Спасибо! Суть стала понятна.
...
Рейтинг: 0 / 0
Трудности перевода... Или как корректно раскодировать header.subject в Synapse
    #40036217
Softologic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тему можно закрыть. Всем большое спасибо за помощь!
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Трудности перевода... Или как корректно раскодировать header.subject в Synapse
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]