Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Трудности перевода... Или как корректно раскодировать header.subject в Synapse / 16 сообщений из 16, страница 1 из 1
15.01.2021, 15:56
    #40036135
Softologic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Трудности перевода... Или как корректно раскодировать header.subject в Synapse
Всем привет!
Применяю 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
15.01.2021, 16:06
    #40036138
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Трудности перевода... Или как корректно раскодировать header.subject в Synapse
SoftologicЕсли подробнее - в веб-почте все норм:

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


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


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

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

Задача звучит так: трансформировать строку '=?utf-8?B?Rnc6IM61zrnOtM+JzrvOv869INGE0LjQu9C+0YHQvtGE0Ys=?=' в "ειδωλον философы"
...
Рейтинг: 0 / 0
15.01.2021, 16:48
    #40036184
Softologic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Трудности перевода... Или как корректно раскодировать header.subject в Synapse
_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
15.01.2021, 16:50
    #40036188
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Трудности перевода... Или как корректно раскодировать header.subject в Synapse
Softologic
Код: pascal
1.
sf:=TEncoding.UTF8.GetString(b);

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


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

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

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

Единственный правильный способ: прочитать название кодировки после первого знака вопроса.
Оно для того там и написано.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
15.01.2021, 17:15
    #40036209
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Трудности перевода... Или как корректно раскодировать header.subject в Synapse
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
15.01.2021, 17:30
    #40036216
Softologic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Трудности перевода... Или как корректно раскодировать header.subject в Synapse
_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
15.01.2021, 17:31
    #40036217
Softologic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Трудности перевода... Или как корректно раскодировать header.subject в Synapse
Тему можно закрыть. Всем большое спасибо за помощь!
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Трудности перевода... Или как корректно раскодировать header.subject в Synapse / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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