C++ builder i polskie znaki w IdMessage1->Subject

0

Witam wszystkich zaglądających.

Próbuje napisać mały programik, który będzie wysyłał z programu maila.
Generalnie wszystko działa, ale bez polskich znaków.

Zapewne cos robie złe, choć wydaje mi się, że cos jest jednak zepsute.

Dodam, że program w Windows działa prawidłowo, wysyła polskie znaki.
Gdy skompiluję go na androida, to polskich znaków nie ma w temacie, w treści natomiast polskie znaki są.


// login information
	IdSMTP1->Host = "";
	IdSMTP1->Username = "";
	IdSMTP1->Password = "";

	IdMessage1->Clear();
	IdMessage1->Recipients->EMailAddresses = ETo->Text;


	IdMessage1->ContentType = "text/plain; charset=utf-8;";
	//IdMessage1->CharSet = "utf-8";
	IdMessage1->Subject = "Potwierdzenie wysyłania przesyłki.";
	//IdMessage1->ContentTransferEncoding = "8bit";



	
	IdMessage1->Body->Text = Memo2->Text;
	IdMessage1->Body->Add(Memo1->Text);

	try {
		IdSMTP1->Connect();
		IdSMTP1->Send(IdMessage1);
	}
	catch(...) {
		ShowMessage("error...");
	}
	IdSMTP1->Disconnect();


0

Jakiego typu są te borlandowe stringi? Nie znam obecnego Buildera bo to nisza, a Borland, tfu, Builder ;) na andku to nisza w niszy (jak już padło wyżej), ale wiem, że Android nie ma (nie miał?) wchara. Jakiś błąd z cyklu UTF16<>UTF8? Tzn. spekuluję radośnie, ale w tym kierunku by obstawiał.

0

Wydaje mi sie, że zwraca Stinga.

1

Nie wiem czy nie musisz dodatkowo użyć ustawiania charsetu w tytule e-maila, tzn. np.

IdMessage1->Subject = "Potwierdzenie =?UTF-8?B?d3lzxYJhbmlhIHByemVzecWCa2ku?=";

Najlepiej zrobić encode swojego tytułu do base64, dokleić ten string base64 do =?utf-8?B?, i wysłać w ten sposób, tzn. np.

"=?utf-8?B?" + base64_encode("zażółć gęślą jaźń") + "?="

Sprawdź:

1
tom1234 napisał(a):

Dodam, że program w Windows działa prawidłowo, wysyła polskie znaki.
Gdy skompiluję go na androida, to polskich znaków nie ma w temacie, w treści natomiast polskie znaki są.

https://stackoverflow.com/a/67737402/1387438
Problem powinien być analogiczny.

Po prostu musisz się upewnić:

  • jakie jest kodowanie pliku źródłowego
  • że kompilator wie jakie jest kodowania kodu źródłowego
  • jakiego kodowania używa kompilator przy tworzeniu kodu wykonalnego (jakie kodowanie mają string litrerals)
  • musisz się upewnić, że standardowa biblioteka C++ wie jakie jest kodowanie literałów std::locale::global.

Z tego co wiem TString używa zawsze jednego kodowania (chyba UTf-16 według Dragona UTF-8) i błąd powstaje podczas konwersji literału do TString (właśnie dlatego problemem jest tylko tytuł).

Zgaduje, że na Windows źródła zakodowało jako Windows-1252 a na Linux interpretuje kod jako UTF-8 i przez to kodowanie znaków ci się rozjeżdża.

0

Sprawdziłem typy

IdMessage1->Subject /Jest UnicodeString

screenshot-20210723162752.png

Edit1->Text //Też jest UnicodeString

screenshot-20210723162941.png

Czy muszę na pewno to konwertować jeśli są tego samego typu?

1

Skoro to jest UnicodeString, a nie TString to użyj literału z szerokimi znakami.

IdMessage1->Subject = L"Potwierdzenie wysyłania przesyłki.";

To powinno załatwić sprawę (chyba, że problem jest kodowanie plików źródłowych - patrz wyżej).

0

@tom1234, zapisz źródła jako UTF8 lub przekonwertuj literały zgodnie z podanym linkiem: http://docwiki.embarcadero.co[...]/en/UTF-8_Conversion_Routines

0

Zmieniłem kodowanie pliku na utf8, ale to też nie pomogło.

Na androidzie chyba nie będą działały polskie znaki.

0

Możesz podesłać źródło tego e-maila który jest wygenerowany przez tę C++Builderową bibilotekę?

0

Poniżej źródło.

Return-Path: <>
Delivered-To: ..
Received: from ..
	by ... with LMTP
	id jqErDQ11/mC+NgAAseEAdg
	(envelope-from <>)
	for <..>; Mon, 26 Jul 2021 10:40:45 +0200
Return-path: <>
Envelope-to: ....
Delivery-date: Mon, 26 Jul 2021 10:40:45 +0200
Received: from mail by ... with spam-scanned (Exim 4.94.2)
	id 1m7wAH-00059s-4W
	for ...; Mon, 26 Jul 2021 10:40:45 +0200
X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on ...l
X-Spam-Level: 
X-Spam-Status: No, score=0.0 required=5.0 tests=ALL_TRUSTED,MISSING_FROM,
	TVD_SPACE_RATIO autolearn=no autolearn_force=no version=3.4.6
Received: from apn-37.dynamic.gprs.plus.pl ([37.1.] helo=localhost)
	by ... with esmtpa (Exim 4.94.2)
	id 1m7wAG-00059o-UR
	for ....; Mon, 26 Jul 2021 10:40:45 +0200
Subject: Potwierdzenie wysy?ania przesy?ki.
To: ....
Content-Type: text/plain; charset=UTF-8
Date: Mon, 26 Jul 2021 10:40:45 +0200
Message-ID: <GENERATED-WASMISSING-1m7wAG-00059o-UR@...>
X-ACL-Warn: Adding Message-ID header because it is missing!
0

@tom1234: Próbowałeś ustawiać Subject w ten sposób?

IdMessage1->Subject = "Potwierdzenie =?UTF-8?B?d3lzxYJhbmlhIHByemVzecWCa2ku?=";

0

Tak, dostaje maila jak na zdjęciu.

screenshot-20210726111957.png

0

A przeczytałeś moją odpowiedź na SO i sprawdziłeś, każdy krok (jest ich aż 4), w którym kodowanie może się schrzanić? (wystarczy, że jeden krok będzie źle).
Na SO piszę o MSVC ale dla C++ Builder zasada jest dokładnie ta sama.

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