Kodowanie znaków zarówno przy wyświetlaniu ich z kodu jak i pobieraniu z M Access i zapis. do xls

0

Cześć,

Piszę aplikację która ma na celu pobrać parę dupereli z bazy MS Access i zapisać do pliku xls. Korzystam z frameworka Qt jak i biblioteki BasicExcel.

Jednak co bym nie zrobił nie jestem w stanie wyświetlić polskich znaków diakrytycznych ani w interfejsie programu ani w pliku docelowym.

Co ciekawe znaki diakrytyczne poprawnie się wyświetlają w oknie wyjścia Qt Creatora, ale tylko te surowe pobrane z bazy. Innymi słowy jeśli pobiorę dane z pliku Access i wyświetlę w oknie wyjścia Qt Creator'a to będę miał ogonki, jeśli natomiast spróbuję wyświetlić w tym oknie tekst zawierający ogonki który umieściłbym w kodzie to dostanę jakiś niezrozumiały bełkot.

Kodowanie tego IDE jest ustawione obecnie na UTF8 chociaż nawet jak zmieniałem to nie robiło mu to różnicy i też poprawnie to okno wyświetlało ogonki.

Bardzo proszę o pomoc.

0

Kodowanie w IDE a w aplikacji to dwie rozne rzeczy. Ustawiles kodowanie w aplikacji np. na UTF-8 (QTextCodec)?

0

Wypróbowałem wiele różnych kodowań zaczynając od UTF-8, a na Windows-1250 skończywszy.

Kod użyty w kolejnej próbie ( wynik jako ss w załączniku ):

 #include <iostream>
#include <QtCore>
#include <QString>
#include <QLocale>
#include <QTextCodec>

int main(int argc, char *argv[])
{
    QLocale Locale = QLocale(QLocale::Polish, QLocale::Poland);
    QLocale::setDefault(Locale);
    //QTextCodec *pTextCodec = QTextCodec::codecForName("Windows-1250");
    QTextCodec *pTextCodec = QTextCodec::codecForName("UTF-8");
    QTextCodec::setCodecForTr(pTextCodec);
    QTextCodec::setCodecForCStrings(pTextCodec);

    char string[64] = "char:\tzażółć gęślą jaźń";
    QString QString1 = QObject::tr("tr:\tzażółć gęślą jaźń");
    QString QString2 = QString("qstring:\tzażółć gęślą jaźń");

    std::cout << string << std::endl \
              << QString1.toStdString() << std::endl \
              << QString2.toStdString() << std::endl;
    return 0;
}

Korzystając ze standardowej biblioteki c <clocale> jestem w stanie uzyskać polskie znaki diakrytyczne.

#include <iostream>
#include <clocale>

using namespace std;

int main() {

	// setlocale(LC_ALL,"C") is the default locale
	
	cout << "- Default locale:\t" << setlocale(LC_ALL, NULL) << endl;
	cout << "- Setting locale to enviroments default" << endl;
	setlocale(LC_ALL, "");
	
	cout << "  - Enviroment default locale:\t" << setlocale(LC_ALL, NULL) << endl;	
	cout << "  - zażółć gęślą jaźń" << endl;
	
	return 0;
}

Co ja robię źle? :/

p.s.
Kodowanie w edytorze qt creator jest ustawione na UTF-8 z usuwaniem BOM

edit>
Natomiast clocale nie chce mi się uruchomić w windowsowym cmd. W oknie cygwina działa, ale przez cmd żąda biblioteki cygwin1.dll. Po ponownej kompilacji używając argumentu -mno-cygwin, program zaczął poprawnie się uruchamiać w cmd jak i cygwinie. Niestety spowodowało to utratę kodowania znaków i brak ich poprawnego wyświetlania przez cygwin'a jak i przez cmd... czarna rozpacz...

0

Trzeba było mówić, że chodzi ci o kodowanie na konsoli, bo w Windows ma to duże znaczenie.

#include <iostream>
#include <clocale>
 
using namespace std;
 
int main()
{
    setlocale(LC_CTYPE,".1250");
    cout << "zażółć gęślą jaźń" << endl;
}

Przechwytywanie.png

To zakładając, że plik .cpp będzie w CP1250.

0

Dziwne i nie do końca zrozumiałe dla mnie, ale jeśli użyję jako parametru .1250 i zapiszę plik cpp z kodowaniem Windows-1250 to zadziała. Co mam jednak zrobić kiedy używam Frameworka Qt? Niestety ani użyty w kodzie ani zakomentowany sposób nie działa.

#include <iostream>
#include <QtCore>
#include <QString>
#include <QLocale>
#include <QTextCodec>

int main()
{
    QLocale Locale = QLocale(QLocale::Polish, QLocale::Poland);
    QLocale::setDefault(Locale);
    //QTextCodec *pTextCodec = QTextCodec::codecForName("Windows-1250");
    QTextCodec *pTextCodec = QTextCodec::codecForName(".1250");
    QTextCodec::setCodecForTr(pTextCodec);
    QTextCodec::setCodecForCStrings(pTextCodec);

    char string[64] = "char:\tzażółć gęślą jaźń";
    QString QString1 = QObject::tr("tr:\tzażółć gęślą jaźń");
    QString QString2 = QString("qstring:\tzażółć gęślą jaźń");

    std::cout << string << std::endl \
              << QString1.toStdString() << std::endl \
              << QString2.toStdString() << std::endl;
    return 0;
}
 

Chciałbym również się dowiedzieć co mam zrobić jeśli kodowanie w pliku cpp jest ustawione na np. UTF-8, muszę wtedy użyć jakiejś biblioteki konwertującej jak libiconv?

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