IdUDPServer1 i kodowanie polskich znaków klient-serwer

0

Witam :)
po zmianie indy pojawił mi się problem z kodowaniem,
Program jest serwerem UDP, otrzymuje od klienta ciąg znaków i zapisuje je na dysku, gdy klient poprosi o te dane wczytuje je z dysku i przesyła... i tu pojawia się problem ponieważ zmienia się kodowanie i polskie znaki zamieniają się na krzaczki...
t

void __fastcall TForm1::IdUDPServer1UDPRead(TIdUDPListenerThread *AThread,
      const TIdBytes AData, TIdSocketHandle *ABinding)
{
TStringList *lst = new TStringList();
if (AData.Length > 0)
{
lst->Text = BytesToString(AData); ///tutaj następuje pobranie danych
lst->SaveToFile("cos.txt");/// zapis
}
delete lst;
}

gdy klient poprosi wysyłam w ten sposób

lst->LoadFromFile("cos.txt");
IdUDPServer1->Send(ABinding->PeerIP,ABinding->PeerPort,lst);/// dane są dostarczone do klienta ale.... kodowanie się zmienia...

na wejściu od klienta podawane dane są w ASCII ,próbowałem dodać IndyTextEncoding_UTF8() itp nic nie pomaga... ktoś się z tym spotkał? czy może popełniam błąd...

0
  1. Ja w tym kodzie nie widze podanego kodowania (konwersje sa w sumie 4 - zakladam ze LoadFromFile zwraca string). To moze oznaczac jakies kodowanie udokumentowane, ale duzo bardziej prawdopodobne jest "domyslne"/"systemowe"/... co w tym przypadku jest tozsame z "losowe". Rozsadne API powinno miec mozliwosc podania kodowania zawsze kiedy sie zamienia string na byte i odwrotnie. Jesli masz taka opcje to podaj.
  2. Jesli to jest caly kod zapisujacy/odczytujacy dane na/z dysku to po co jest ta konwersja na string?
  3. Mozesz miec wyciek pamieci.
  4. Nazwy klasy mi sugeruje ze kod wolany jest w watku UI, co oznacza ten kod moze zwiesic aplikacje na blizej nieokreslony czas.
0

Off topic, ale skąd pomysł żeby zmienną co kończy życie z końcem funkcji alokować dynamicznie?

1

Z tego co zrozumiałem, to problem jest w plikach tekstowych. Dodaj kodowanie przy zapisie i odczycie.

lst->SaveToFile("cos.txt", TEncoding::UTF8); /// zapis
....
lst->LoadFromFile("cos.txt", TEncoding::UTF8);
0

W ogóle tego nie przesyłaj jako stringa tylko jako dane binarne, teraz masz 4 razy konwersję bajty -> znaki i z powrotem, w ogóle tego nie potrzebujesz. Znajdź metody które zwracają ciąg bajtów a nie stringi i prześlij to jako bufor bajtów

1
arturx87 napisał(a):

czy może popełniam błąd...

Tak.
wybierajac tę platformę i ten sposób develpmentu (makaron na GUI)

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