Wyświetlanie polskich znaków w konsoli

0

Czy ktoś wie jak zrobić w konsoli Qt aby wyświetlały się polskie znaki ?

mam coś takiego jak na zrzucie niżej

screenshot-20221223230621.png
powinien być napis "żółty"

a kod który mi to robi jest taki

QObject::connect(&server, &QTcpServer::newConnection,
    [&]()
    {
        socket = server.nextPendingConnection();
        socket->waitForReadyRead();
        QString data;
        data = socket->readAll();
        qInfo()<< data.toLatin1();
    }
    );

głównie chodzi o to, że zrobiłem sobie serwer TCP i ten nie toleruje polskich znaków. Jak to poprawić ?

5

Żartujesz sobie? Konwertujesz do kodowania, które polskich znaków nie ma i dziwisz się, że ich nie ma? toLatin1() --> ISO-8859-1

No i jeszcze warto sprawdzić w jakim kodowaniu dostajesz znaki na wejściu. Najłatwiej wszędzie operować UTF-8 i się nie musieć takimi rzeczami przejmować.

1
kq napisał(a):

Żartujesz sobie? Konwertujesz do kodowania, które polskich znaków nie ma i dziwisz się, że ich nie ma? toLatin1() --> ISO-8859-1

dziwię się, bo nic innego tam nie ma, dodam, że jak użyję toUtf8 mam coś takiego

screenshot-20221223231920.png

1

No i to wygląda całkiem poprawnie. Jest jakiś powód, dla którego nie chcesz wyswietlać QStringa data po prostu?

1
kq napisał(a):

No i to wygląda całkiem poprawnie. Jest jakiś powód, dla którego nie chcesz wyswietlać QStringa data po prostu?

poprawnie ? A gdzie czytelność ? Bo nie rozumiem ? Powód użycia QStringa był taki, żeby pokazał mi się ludzki tekst czyli "żółty"

1

Ale przecież nie używasz QStringa, tylko QByteArray. I dziwisz się, że dostajesz w debugowym logu debugowy widok tego QByteArray.

Poprawnie:
screenshot-20221223232401.png

0
kq napisał(a):

Ale przecież nie używasz QStringa, tylko QByteArray. I dziwisz się, że dostajesz w debugowym logu debugowy widok tego QByteArray.

Poprawnie:
screenshot-20221223232401.png

zaraz, a to nie jest tak, że jak użyję

QString data;
data = socket.readAll();
qInfo()<< data.toUtf8(); //czy ta linijka już w tym momencie nie powinna mi to przerobić na normalny tekst ?
2

Dostajesz QByteArray zawierające dane z data zaenkodowane w UTF-8. Ponieważ liczba bajtów może ≠ liczbie znaków, a QDebug ma wspierać debugowanie, to wyświetla wszystkie wartości bajtów, zamiast ich reprezentacji w Unicode. Chcesz ładny string to drukuj QString.

4

Zauważ że teraz robisz konwersję QByteArray (z socketa) do QString (data) do QByteArray (utf8) do QString (fromUtf8). Bezsens

możliwe, że tak ale jeszcze raz powtórzę - w klasie która odbiera dane z socketa, nie ma żadnej funkcji, która konwertowałaby bezpośrednio do QStringa, funkcja zwraca tylko dane QByteArray i tylko to mogę użyć

Widzę, że strasznie opornie ci idzie, masz tu pełny przykład, zastanów się jak i dlaczego to działa

#include <QDebug>
#include <QByteArray>
#include <QString>

QByteArray socketRead()
{
    return "żółty";
}

int main()
{
    QByteArray byte_array = socketRead();
    QString data = byte_array;
    QByteArray byte_array_again = data.toUtf8();
    QString string_again = QString::fromUtf8(byte_array_again);
    qInfo() << byte_array << data << byte_array_again << string_again;
}

Wynik:

"\xC5\xBC\xC3\xB3\xC5\x82ty" "żółty" "\xC5\xBC\xC3\xB3\xC5\x82ty" "żółty"
0

@kq:

No to coś robisz nie tak, SOA#1

zamiast screena, to daję kod który mam

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QTcpServer server;
    QTcpSocket *socket;

    server.listen(QHostAddress("192.168.0.164"), 12345);

    QObject::connect(&server, &QTcpServer::newConnection,
    [&]()
    {
        socket = server.nextPendingConnection();
        socket->waitForReadyRead();
        QString data;
        qInfo()<< data;
    }
    );

    return a.exec();
}
2
        QString data;
        qInfo()<< data;

🙄🙄🙄 coś przestałeś inicjalizować tę zmienną danymi.

0
kq napisał(a):
        QString data;
        qInfo()<< data;

🙄🙄🙄 coś przestałeś inicjalizować tę zmienną danymi.

poprawione

QString data;
data = socket->readAll();
qInfo()<< data;
0

@kq: mam jedno pytanie - wyjaśnij mi proszę, bo nie rozumiem - klasa QString ma przeładowany operator << i wygląda on tak QDataStream &operator<<(QDataStream &stream, const QString &string) - dlaczego jak ten operator zwraca QDataStream - to widzę normalny tekst ? Dodam, że klasa QDataStream nie zwraca QStringa

1

@zkubinski:

mam jedno pytanie - wyjaśnij mi proszę, bo nie rozumiem - klasa QString ma przeładowany operator << i wygląda on tak QDataStream &operator<<(QDataStream &stream, const QString &string) - dlaczego jak ten operator zwraca QDataStream - to widzę normalny tekst ? Dodam, że klasa QDataStream nie zwraca QStringa

Już Ci kq pisał — to działa tak, jak std::cout i podobne. Czyli to nie QString ma przeładowany ten operator, tylko QDataStream ma przeładowany ten operator, wykonanie tej funkcji-operatora powoduje wypisanie na konsolę, a zwracany jest QDataStream, żeby móc chainować — qInfo() << byte_array << data << byte_array_again << string_again;. Po kolei wykonuje się to tak: najpierw qInfo() << byte_array wypisuje byte_array, po czym zwraca referencję do wyjściowego qInfo (co jest w praktyce nierozróżnialne od jawnego wzięcia iInfo od nowa), to nowe-stare qInfo wywołuje <<data, co wypisuje data i zwraca kolejną referencję, ta znowu wykonuje swóją <<byte_array_again, co zwraca czwartą referencję do pierwotnego qInfo, i na końcu ta czwarta referencja do qInfo działa z string_again. Efektem jest jeszcze jedna referencja do qInfo, ale to już nic nie robi, bo nikt od niej nic nie chce.

EDYCJA:
Poprawiłem terminologię zgodnie z uwagami _13th_Dragona.

EDYCJA 2:
A wyobraź sobie teraz, dla odmiany, co by było, gdybyś miał API, które by nie działało tak, jak to, tylko miałbyś funkcję drukującą, która nie zwraca referencji do obiektu drukującego, a właśnie stringa. To wywołujesz to raz… i masz stringa. Co z nim chcesz zrobić? Po co Ci dalej ten string? Nie możesz chainować, tylko musisz się za każdym razem odwoływać do „drukarki”, i ogólnie całość się szybko robi niewygodna.

2
zkubinski napisał(a) w komentarzu:

mam jedno pytanie - wyjaśnij mi proszę, bo nie rozumiem - klasa QString ma przeładowany operator << i wygląda on tak QDataStream &operator<<(QDataStream &stream, const QString &string) - dlaczego jak ten operator zwraca QDataStream - to widzę normalny tekst ? Dodam, że klasa QDataStream nie zwraca QStringa

To jest jedna z podstawowych rzeczy która wytłumaczona w każdym kursie z podstawami.
Prościej zrozumieć na przykładzie (w większości kursów z podstaw jest to podano):

#include <iostream>
#include <cmath>
using namespace std;

class Accumulator
{
	private:
	double sum;
	size_t count;
	public:
	Accumulator():sum(0),count(0) {}
	Accumulator &operator<<(double value)
	{
		sum+=value;
		++count;
		return *this;
	}
	double Sum()const { return sum; }
	size_t Count()const { return count; }
	double Average()const { return count?sum/count:NAN; }
	void reset() { sum=count=0; }
};

//ewentualnie
/*
Accumulator &operator<<(Accumulator &acc,double value)
{
	acc.sum+=value;
	++acc.count;
	return acc;
}
*/

int main()
{
	Accumulator acc;
	acc<<1<<2<<3<<4;
	cout<<"sum="<<acc.Sum()<<"; count="<<acc.Count()<<"; average="<<acc.Average()<<';'<<endl;
	return 0;
}

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.