Indy 10 - wieczne problemy z polskimi literami i nie tylko

0

Cześć, przeczytałem już sporo na ten temat.
Mam Delphi 2005 Update 3. NIE JEST to wersja personal.

Mam też Indy 10, dokładnie 10.0.20, a więc dość stare.

Próbuję wysłać maila z polskimi znakami. Cokolwiek bym nie robił, są krzaczki. Jakiegokolwiek bym nie użył kodowania, to i tak w źródle odebranej wiadomości mam: iso-8859-1.

Czytają różne rzeczy, doszedłem do wniosku, że to problem z Indy. Więc zacząłem szukać najnowszej wersji. I tu problem nr 1. Gdzieś znalazłem, że najnowsza to 10.1.coś, a gdzieś indziej, że 10.2.coś. Dodatkowo nie mogę pobrać żadnej wersji, bo nie wiadomo skąd. Na stronach Indy piszą, że pobrana wersja powinna działać, ale może się okazać, że się w ogóle nie skompiluje, bo właśnie nad nią pracują. Co to k*** jest? Jedyny link jaki znalazłem na stronach Indy przenosi donikąd.

Tak więc, czy ktoś wie, jak zdobyć i zainstalować najnowszą wersję Indy 10? A może ktoś wie, jak ominąć ten problem z polskimi znakami?

[DOPISANE]

Jedyne, co udało mi się uzyskać to polskie litery w treści. Natomiast temat nadal zawiera krzaczki.
Okazuje się, że Indy, jeśli są polskie litery, lub skonwertowane znaki na quoted-printable dokleja na początku w nagłówku tematu kodowanie iso-8859-1, w nagłówku wygląda to tak:

Subject:
 =?ISO-8859-1?Q?<temat>?=

I nie udaje mi się tego kodowania uniknąć.

Polskie litery w treści uzyskałem za pomocą konwersji, tzn:

IDMessage.CharSet:='iso-8859-2';
IDMessage.Body.Text:=ConvertString(mailContent);

gdzie funkcja ConvertString konwertuje w przekazanym ciągu konkretne znaki:

     S:=stringReplace(s, 'ą', chr(StrToIntDef('$B1', 0)), [rfReplaceAll]);
     S:=stringReplace(s, 'ć', chr(StrToIntDef('$E6', 0)), [rfReplaceAll]);
     S:=stringReplace(s, 'ę', chr(StrToIntDef('$EA', 0)), [rfReplaceAll]);
     S:=stringReplace(s, 'ł', chr(StrToIntDef('$B3', 0)), [rfReplaceAll]);
     S:=stringReplace(s, 'ń', chr(StrToIntDef('$F1', 0)), [rfReplaceAll]);
     S:=stringReplace(s, 'ó', chr(StrToIntDef('$F3', 0)), [rfReplaceAll]);
     S:=stringReplace(s, 'ś', chr(StrToIntDef('$B6', 0)), [rfReplaceAll]);
     S:=stringReplace(s, 'ź', chr(StrToIntDef('$BC', 0)), [rfReplaceAll]);
     S:=stringReplace(s, 'ż', chr(StrToIntDef('$BF', 0)), [rfReplaceAll]);
     S:=stringReplace(s, 'Ą', chr(StrToIntDef('$A1', 0)), [rfReplaceAll]);
     S:=stringReplace(s, 'Ć', chr(StrToIntDef('$C6', 0)), [rfReplaceAll]);
     S:=stringReplace(s, 'Ę', chr(StrToIntDef('$CA', 0)), [rfReplaceAll]);
     S:=stringReplace(s, 'Ł', chr(StrToIntDef('$A3', 0)), [rfReplaceAll]);
     S:=stringReplace(s, 'Ń', chr(StrToIntDef('$D1', 0)), [rfReplaceAll]);
     S:=stringReplace(s, 'Ó', chr(StrToIntDef('$D3', 0)), [rfReplaceAll]);
     S:=stringReplace(s, 'Ś', chr(StrToIntDef('$A6', 0)), [rfReplaceAll]);
     S:=stringReplace(s, 'Ź', chr(StrToIntDef('$AC', 0)), [rfReplaceAll]);
     S:=stringReplace(s, 'Ż', chr(StrToIntDef('$AF', 0)), [rfReplaceAll]);

zgodnie z tablicą znaków.
Natomiast, tak jak mówię, nie rozwiązuje to problemu z polskimi znakami w treści tematu.
Tak więc problem cały czas istnieje.

0

jest jedno bardzo proste i skuteczne rozwiązanie - nie używać indy. Ale ty pewnie i tak zrobisz po swojemu i zamiast zamienić ten badziew na coś normalnego będziesz się z nim szarpał.
BTW pasz przecież źródła do indy - nie podoba ci się jak działa - zmień sobie

0
Juhas napisał(a)

S:=stringReplace(s, 'ą', chr(StrToIntDef('$B1', 0)), [rfReplaceAll]);
S:=stringReplace(s, 'ć', chr(StrToIntDef('$E6', 0)), [rfReplaceAll]);
</delphi>

uch, rany boskie... jak już konwertować, to tak:

{ odpowiednio przygotowana tablica odpowiedników znaków jednego kodowania w drugim }
var konwersja:array[char] of char = (#$00, #$01, ...., #$FF);
...
{i sama konwersja w postaci jednej prostej pętli: }
for i:=1 to length(s) do
  s[i]:=konwersja[s[i]];
0

No, dalej muszę się użerać z tym, bo za dużo musiałbym zmieniać.

Odnalazłem odpowiednie miejsca w kodzie, co i jak zmienić.
Jakby to kogoś interesowało, otwieramy plik IDGlobalProtocols.pas, następnie odnajdujemy w nim funkcje: IdGetDefaultCharset.
Dodajemy jej parametr:
IdGetDefaultCharSet(Default: TIDCharset = idcsISO_8859_2)

Następnie w ciele funkcji dla Windows odnajdujemy fragment:

else begin
  Result := idcsISO_8859_1;
end;

i zmieniamy na:

else begin
   //Result := idcsISO_8859_1;
   Result:=Default; //by Juhas
end;

Następnie otwierami plik IDMessage.pas i odnajdujemy wywołanie funkcji IDGetDefaultCharset(są ich 2). Wpisujemy jej w parametrze FCharSet.

Dzięki temu będzie brany pod uwagę zdefiniowany przez programistę Charset.

Problem mam tylko jeden. Wstyd się przyznać, ale nie mam pojęcia, jak to przekompilować. Próbowałem odnaleźć odpowiedni pakiet, nie udało się. Próbowałem usunąć i dodać Indy z Install Packages, ale też nie poszło. Może mi ktoś powiedziec, jak to cholerstwo przekompilować?

1 użytkowników online, w tym zalogowanych: 0, gości: 1