[MEGOLDVA!] PyQt4 illetve PySide ékezetes szöveg probléma

PyQT illetve PySide használatával írnék egy programot. (Nem egyszerre, hanem párhuzamosan írom mind a két widget használatával.)
Az alábbi kódrészlet betölti egy ComboBox-ba a partnerek ID-jét illetve nevét egy stringgé összefűzve.


    def BetoltesPartnerek(self):
        cur.execute("select * from partner")
        numsorok = int(cur.rowcount)
        self.comboBox_Partnerek.clear()
        for i in range(numsorok):
            sor = cur.fetchone()
            nev=sor[1]
            #nev.encode('utf-8')
            self.comboBox_Partnerek.insertItem(i,str(sor[0])+": "+nev)
            # self.comboBox_Partnerek.insertItem(i,str(sor[0])+": "+sor[1])

Sajnos a comboBox-ban a névben a hosszú őŐ és űŰ helyett kérdőjel jelenik meg.
A "nev" változót már azért vettem fel, hogy tudjam manipulálni mielőtt a comboboxba teszem.
Az adatok MySQL adatbázisból jönnek, ahol az adatbázis alap kódolása UTF8_hungarian_ci, de az UTF8_default_ci-ve is ugyanez volt az eredmény.

Szóval a kérdés az, hogy a comboBox-ban hogyan lehet UTF-8-as szöveget helyesen megjeleníteni, beleértve az őŐ és űŰ betűket is.?

A megoldás:


def dbNyitas(phost='localhost',puser='uszallito',ppasswd='x321',pdb='dbszallito'):
    adatBazis = MySQLdb.connect(host=phost, user=puser, passwd=ppasswd, db=pdb, use_unicode=True, charset="utf8")
    cur = adatBazis.cursor()

Tehát a Python MySQLdb használata esetén az adatbázis megnyitásakor explicit módon meg kell adni, hogy unikódot használunk mégpedig utf-8 kódolással!
Nekem eredetileg csak ennyi volt:


def dbNyitas(phost='localhost',puser='uszallito',ppasswd='x321',pdb='dbszallito'):
    adatBazis = MySQLdb.connect(host=phost, user=puser, passwd=ppasswd, db=pdb)
    cur = adatBazis.cursor()

Azaz

use_unicode=True, charset="utf8"

hiányzott és ezek szerint az alapértelmezés valami más.

A tanulság: olvassunk doksikat! http://mysql-python.sourceforge.net/MySQLdb.html

Hozzászólások

A cur az micsoda?
A jelenlegi locale milyen?
A DB locale milyen?

Milyen DB egyaltalan?

Plz, konkretizald a kerdest, mert ez egy tobbkomponensu cuccnak tunik, es nagyon verszegeny, ami itt van.
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal 

MySQLdb-t használok nem a QtSQL-t. Ez gyorsabbnak tűnik, meg számomra egyelőre áttekinthetőbb.


adatBazis = MySQLdb.connect(host=phost, user=puser, passwd=ppasswd, db=pdb)
cur = adatBazis.cursor()

A *.py fájlok mind "# -*- coding: utf-8 -*-" szerintiek. És ténylegesen utf-8-as kódolásúak.

A "QtCore.QTextCodec" az alapértelmezett szerinti azt nem tudom, hogy mi.
Próbáltam így:


   tc = QtCore.QTextCodec.codecForName("utf-8")
   QtCore.QTextCodec.setCodecForCStrings(tc)

de ettől csak rosszabb lett. Az "utf-8" helyett próbáltam még a következőket is: "utf-16", "utf-32"
A sima "utf" használatával az eredmény ugyanaz, mintha semmit sem állítanék be!

Az adatbáziskezelő MySQL az adatbázis MyISAM; az illesztés: utf8_hungarian_ci
A táblák InnoDB; az illesztés: utf8_hungarian_ci

--
Tertilla; Tisztelem a botladozó embert és nem rokonszenvezem a tökéletessel! Hagyd már abba!; DropBox

Sima Qt-ben, hogy az UTF8-as kód renderelése jó legyen, ezt használom a main-ben:

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

Python nyelvre ezt fordítsd le te :P Ennél többet nem kellett nekem még beállítani, Qt oldalon, feltéve hogy a MySql felén minden UTF8:

mysql> status
...
Server characterset: utf8
Db characterset: utf8
Client characterset: utf8
Conn. characterset: utf8

Ha még ez sem segít, akkor esetleg mégis a Qt beépített SQL kezelőjével kellene próbálkozni, hátha az változtat az eredményen.

A mysql status ugyanezt adja vissza.
A kodolás Python Qt4 esetében pedig ez:


kodolas=QtCore.QTextCodec.codecForName("utf-8")
QtCore.QTextCodec.setCodecForCStrings(kodolas)
QtCore.QTextCodec.setCodecForLocale(kodolas)

Sajnos ez ront a helyzeten. Így minden ékezetes betű helyén valami értelmezhetetlen karakter jelenik meg.
Ha "utf-8" helyett "utf"-et használok akkor csak az őŐ és űŰ helyett van kérdőjel. De ez lehet az alapértelmezés is.
--
Tertilla; Tisztelem a botladozó embert és nem rokonszenvezem a tökéletessel! Hagyd már abba!; DropBox

A nyitó posztban leírtam a megoldást.
Érdekes módon ezek után bármilyen kódolást (utf, utf-8, utf-16) állíthatok be az induló python szkriptben, az átvett MySQL adatok, mindig helyesen jelennek meg.
--
Tertilla; Tisztelem a botladozó embert és nem rokonszenvezem a tökéletessel! Hagyd már abba!; DropBox

Köszönöm, mindkettőtök segítségét.
Azok alapján jártam be azt az utat, ami a megoldáshoz vezetett.
--
Tertilla; Tisztelem a botladozó embert és nem rokonszenvezem a tökéletessel! Hagyd már abba!; DropBox