Listbox zapisuje dziwne znaki (Bez przekonwertowania) [C++]

0

Witam, mój listbox zapisuje znaki bez przekonwertowania

Przykład:
ąśćłó
Testowa wiadomość

Czy jest sposób, aby w c++ przekonwertować to na polskie znaki?
Domyślam się, że chodzi o UTF-8.

0

A skąd te znaki bierze? To wygląda jak niezgodność kodowań.

3

Mam awarię kryształowej kuli, więc ciężko będzie ci pomóc.

0

@kq: Pobiera je po prostu z stringa normalnego..

Chodzi mi tutaj głównie o przekonwertowanie tego, czy istnieje taki sposób?

3

A mógłbyś trochę więcej informacji podać, czy mamy zgadywać?

6

zamiast prosić nas o filozoficzne rozważania, pokaż kod o którym piszesz.
Nawet nie wiadomo czego używasz: Qt, Win API, wxWidgets, C++CLI .net, .... .
Weź wklej kod, z którym masz problem.
Jesteś zarejestrowany 2 lata masz +30 postów i nadal nie wiesz, jak zadawać dobre pytania?

5
MarekR22 napisał(a):

Nawet nie wiadomo czego używasz: Qt, Win API, wxWidgets, C++CLI .net, .... .

ArAs2 napisał(a):

@kq: Pobiera je po prostu z stringa normalnego..

Jakiego "normalnego stringa" ? Każde ze srodowisk powyżej, ma swojego stringa, oby jednego, bo i po dwa-trzy "normalne" stringi

0

Hm.. Może rzeczywiście źle to napisałem, więc od początku:

Posiadam kod który pobiera maile:

const vector <ReadMails::Mail>& mails = rm.downloadLastMails(10);

string getContentFromMail = "";
for (const auto& m : mails) {
    if (m.getContentType.find("text") != string::npos) {
        getContentFromMail = m.content;
    }
    else {
        getContentFromMail = "<Nie udało się odczytać>";
    }

    string time = ctime(&m.receivedTime);
    string dataEmail = to_string(m.mailId) + " | \"" + m.subject + "\" (" + m.sender + ") [" + to_string(m.sizeInBytes) + "B] Content: " + getContentFromMail;
    cout << dataEmail << endl;
}

Result z programu wyżej:

10 | "Test" (Test test<[email protected]>) [2863B] Content: ─ů┼Ť─ç┼é├│
9 | "Test" (Test test<[email protected]>) [2880B] Content: Testowa wiadomo┼Ť─ç
8 | "Wielkie mi─Ö┼Ťnie mimo zamkni─Ötych si┼éowni? To mo┼╝liwe! Sprawd┼║ >>" ("Musculinex - EML /o2" <[email protected]>) [45192B] Content: <Nie uda│o siŕ odczytaŠ>
7 | "Szukasz solidnego ubezpieczyciela OC/AC?  Znajd┼║ go z centrum pomocy por├│wneo" ("Porowneo.pl /o2" <[email protected]>) [26637B] Content: <Nie uda│o siŕ odczytaŠ>
6 | "Zadbaj o odporno┼Ť─ç z Omega-3 ÔÇôWypr├│buj za darmo!" ("Natural Pharmaceuticals Sp. z o.o. /o2" <[email protected]>) [13960B] Content: <Nie uda│o siŕ odczytaŠ>
5 | "Szukasz solidnego ubezpieczyciela OC/AC?  Znajd┼║ go z centrum pomocy por├│wneo" ("Porowneo.pl /o2" <[email protected]>) [35373B] Content: <Nie uda│o siŕ odczytaŠ>
4 | "NORMALNIE LATO 2021! Z rabatami do 800 z┼é! Sprawd┼║ >>" ("Rainbow /o2" <[email protected]>) [150081B] Content: <Nie uda│o siŕ odczytaŠ>
3 | "Test" (Test test<[email protected]>) [2745B] Content: Test
2 | "W┼é─ůcz protok├│┼é IMAP/POP/SMTP" (Poczta o2 <[email protected]>) [16066B] Content: <Nie uda│o siŕ odczytaŠ>

Jak możecie zobaczyć zwraca to w dziwnych znakach np: ─ů┼Ť─ç┼é├│

Do pobierania tej poczty używam biblioteki POCO, kod wygląda następująco:

struct Mail {
        time_t receivedTime;
        std::string sender, subject, content, getContentType;
        int sizeInBytes;
        int mailId;
    };

    Mail getMailInfo(POP3ClientSession& session, int messageId) {
        Poco::Net::MailMessage message;
        session.retrieveMessage(messageId, message);

        Mail mail;
        mail.receivedTime = message.getDate().epochTime();
        mail.subject = message.getSubject();
        mail.sender = message.getSender();
        mail.content = message.getContent();
        mail.getContentType = message.getContentType();
        return mail;
    }

    vector <Mail> downloadLastMails(unsigned numberOfMails = 3) {
        try {
            POP3ClientSession session(this->serverAddress, this->port);
            session.login(this->userName, this->password);

            POP3ClientSession::MessageInfoVec messages;
            session.listMessages(messages);

            vector <Mail> downloadedMails;
            unsigned counter = 0;
            for (auto m = messages.rbegin(); m != messages.rend(); ++m)
            {
                if (++counter > numberOfMails)
                    break;

                Mail&& currentMail = getMailInfo(session, m->id);
                currentMail.sizeInBytes = m->size;
                currentMail.mailId = m->id;
                downloadedMails.emplace_back(currentMail);
            }

            return downloadedMails;
        }
        catch (const POP3ClientSession& e) {
            exit(0);
        }
        catch (const POP3Exception& e) {
            exit(1);
        }
        catch (const NetException& e) {
            exit(2);
        }
    }

Używam C++ (+UI Windows Form).
Z tego do czego doszedłem jest to kodowanie windows-1250 czy jest możliwość przekonwertowania tego na utf-8? (Wiadomo mowa tutaj o te dziwne znaczki: ─ů┼Ť─ç┼é├│).

0

Nie ma czegoś takiego jak normalny string. Lektura na dziś: https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character-sets-no-excuses/
Serio, siądź na 20 minut i przeczytaj ze zrozumieniem ten artykuł.

1
ArAs2 napisał(a):

Hm.. Może rzeczywiście źle to napisałem, więc od początku:

Do pobierania tej poczty używam biblioteki POCO, kod wygląda następująco:

Używam C++ (+UI Windows Form).

Zaraz, zaraz ... czyli używasz tego koszmaru C++/CLI, który NIE JEST językiem C++.
Na granicy światów "managed" i "unmanaged" dodajesz sobie extra problemów.

Jesli WinForms, to pisz w prawdziwym C#, oczywiście wtedy już bez POCO (ale jest ogrom prawdziwych, kompatybilnych bibliotek ze stabilnymi stringami) wiele kłopotów odpadnie.
W tej chwili to "dzielnie próbujesz rozwiązać problemy nieznane innym"

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