• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Kodowanie znaków w Qt. Znany problem...

Object Storage Arubacloud
0 głosów
1,648 wizyt
pytanie zadane 22 stycznia 2019 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)
zamknięte 24 stycznia 2019 przez Jakub 0

Hej, wiem że na temat polskich znaków w Qt jest dużo pytań. Patrzyłem na polskie i angielskie posty na forach... i nic mi niestety nie pomogło, mój kod wygląda tak:

#include <QString>
#include <QTextStream>
#include <QTextCodec>

int main() {
   QTextStream cout(stdout);

   QTextCodec::setCodecForLocale(QTextCodec::codecForName("utf-8"));
   QString qstr = QString::fromUtf8("ęłąśżźć itd...");
   cout<<qstr<<endl;
}

A to jest plik *.pro :

TEMPLATE = app
CONFIG += console c++11
CONFIG -= app_bundle
QT += core

SOURCES += \
    main.cpp

Korzystam z Qt-creator ( system windows ). Tu też mam ustawione kodowanie utf-8 :

Jednak dalej mam "krzaki":

Patrzyłem tu: http://doc.qt.io/qt-5/i18n-source-translation.html

Ale po co mi korzystać z tak zaawansowanego narzędzia do tak prostego problemu... Poza tym elementy GUI ( np. message box'y ) już poprawnie mi wyświetlają polskie znaki bez potrzeby ustawiania czegokolwiek ( więc problem dotyczy konsoli ).

Widziałem też takie funkcje:

QTextCodec::setCodecForTr (QTextCodec::codecForName ("UTF-8"));
QTextCodec::setCodecForCStrings( QTextCodec::codecForName( "UTF-8" ) );

ale zostały one usunięte z Qt5...

Nie wiem co jest grane... będę wdzięczny za wskazówki lub link do jakiegoś poradnika gdzie jest to dobrze wytłumaczone. Z góry dziękuje :)

komentarz zamknięcia: temat wyczerpany

1 odpowiedź

+2 głosów
odpowiedź 22 stycznia 2019 przez j23 Mędrzec (194,920 p.)
wybrane 24 stycznia 2019 przez Jakub 0
 
Najlepsza

W Windowsie konsola śmiga na CP852, a nie utf-8. Nie wiem, jak to jest w QtCreatorze, ale jeśli chcesz, żeby literały tekstowe/znakowe były w jakimś konkretnym kodowaniu, powinieneś ustawić opcję kompilatora (MinGW) -fexec-charset na to kodowanie (domyślnie ustawiane jest kodowanie systemowe, czyli Windows-1250).

komentarz 22 stycznia 2019 przez Jakub 0 Pasjonat (23,120 p.)

W Qt ustawianie tego w kompilatorze chyba nie jest konieczne ( bo mamy tą funkcje ). W każdym bądź razie w pliku *.pro dopisałem taką flagę dla MinGW:

QMAKE_CXXFLAGS += -fexec-charset CP852

Zmieniłem też:

QTextCodec::setCodecForLocale(QTextCodec::codecForName("Windows-1250"));

Tak samo ustawiłem takie kodowanie dla pliku *.cpp. Teraz mi się w miejscu polskich znaków wyświetlają pytajniki.

Wiem że mogłem to wszystko kompletnie źle zrozumieć za co z góry przepraszam...

komentarz 23 stycznia 2019 przez j23 Mędrzec (194,920 p.)

Jeśli już, to -fexec-charset=cp852. Jeśli ten parametr zadziała, to żadna konwersja nie będzie potrzebna, wystarczy samo std::cout << "ęłąśżźć itd...\n";

komentarz 23 stycznia 2019 przez Jakub 0 Pasjonat (23,120 p.)
Niestety, jak dodałem tą flagę to QtCreator nie pozwalał nawet na kompilacje programu... poradziłem sobie jednak z problemem inaczej. Znalazłem prosty program który zmienia stronę kodową znaków umieszczonych w cudzysłowach ' " '. To rozwiązało problem. Teraz jeszcze tylko rozwiązać problem na Linuxie, ponoć tam dużo łatwiej :)
komentarz 23 stycznia 2019 przez j23 Mędrzec (194,920 p.)

Znalazłem prosty program który zmienia stronę kodową znaków umieszczonych w cudzysłowach ' " '.

Szczerze mówiąc to słaby sposób. Już lepiej spróbuj unikodowych wersji strumieni wcout/wcin (QString jest unikodowy). Na początku daj setlocale(LC_CTYPE, ".852"); (w MinGW std::locale nie jest w pełni zaimplementowane).

 

Teraz jeszcze tylko rozwiązać problem na Linuxie, ponoć tam dużo łatwiej :)

O tyle łatwiej, że terminal domyślnie śmiga na utf-8, więc wystarczy wysyłać do std::cout tekst w takim kodowaniu. No i nie ma tego rozróżnienia na kodowanie systemowe (ANSI) i OEM (konsola).

komentarz 23 stycznia 2019 przez Jakub 0 Pasjonat (23,120 p.)
Dzięki za radę, zacząłem czytać od podstaw ogólnie na temat kodowania znaków...
komentarz 23 stycznia 2019 przez Jakub 0 Pasjonat (23,120 p.)

Chce wypisać 'Ś' :

  QTextStream cout(stdout);
  std::cout<<char(151)<<"\151"<<std::endl;
  cout<<char(151)<<"\151"<<endl;

A dostaje:

Śi

Yi

( za każdym razem co innego )

Nwm... nie cierpię problemów z tym kodowaniem. W sumie nie mam potrzeby teraz uzyskiwać polskich znaków w konsoli windows z użyciem Qt, bo na visual np. działa mi już funkcja setlocate... ( już tygodnia cały czas grzebie w takich rzeczach zamiast wreszcie wziąć się za GUI gdzie tych problemów nie ma ). Myślałem że w Qt będzie to prosta rzecz, i że pasowało by to wiedzieć... ale tłumaczy się raczej GUI, a osoba która korzysta z terminala/CMD jest pewnie na tyle doświadczona że rozumie angielski :)

* Zaznaczam że na Ubuntu nie było najmniejszego problemu, tylko ciągle ten chory windows daje w kość...

 

1
komentarz 24 stycznia 2019 przez j23 Mędrzec (194,920 p.)

Widać, że linia z std::cout działa dobrze. Łańcuch "\151" nie zawiera tego, co byś chciał - kod litery powinieneś podać w systemie ósemkowym :)

 

tylko ciągle ten chory windows daje w kość...

Nie chory, tylko trzeba pamiętać, że:

  • konsola jest w kodowaniu OEM (pozostałość po czasach DOS-u; w PL: cp852)
  • system jest w kodowaniu ANSI (w PL: Windows-1250) Choć prawda jest taka, że Windows jest w pełni unikodowy (UTF-16). Strony kodowe są tylko dla zachowania wstecznej kompatybilności.

W MinGW wystarczy, że zrobisz tak, jak napisałem i problem znika ;)

Podobne pytania

+1 głos
0 odpowiedzi 459 wizyt
pytanie zadane 14 lipca 2021 w PHP przez <Hunter> Początkujący (430 p.)
0 głosów
0 odpowiedzi 166 wizyt
pytanie zadane 18 listopada 2019 w HTML i CSS przez Remar Nowicjusz (120 p.)
0 głosów
2 odpowiedzi 4,197 wizyt
pytanie zadane 21 marca 2018 w Grafika i multimedia przez xxkondzioxx15 Obywatel (1,440 p.)

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...