• 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,700 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 544 wizyt
pytanie zadane 14 lipca 2021 w PHP przez <Hunter> Początkujący (430 p.)
0 głosów
0 odpowiedzi 171 wizyt
pytanie zadane 18 listopada 2019 w HTML i CSS przez Remar Nowicjusz (120 p.)
0 głosów
2 odpowiedzi 4,259 wizyt
pytanie zadane 21 marca 2018 w Grafika i multimedia przez xxkondzioxx15 Obywatel (1,440 p.)

92,696 zapytań

141,607 odpowiedzi

320,114 komentarzy

62,055 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

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!

...