Hello, thanks for the code.
result is an object of mysqlpp::StoreQueryResult in the sql-libs. It stores the query data. But in the docs of libmysql++ is described, that are the stored data handeld as a derived std::string. Also compatible to the original std::string. I inserted your code as you described and it returns the following output (2 textviews as example, one with shown data, one with empty) The output is taken from console: :::::::::::::::::: SNIP first example data ::::::::::::::::: ** Message: UTF-8 valid: 0: Demozugang ist der gleiche. Auch f\xfcr gesch\xe4ftliche Aktivit\xe4ten (Streeting Unternehmensvertrieb, siehe Unterlagen). Vertriebsnummer: 00028 Vertriebsseite: URL: http://vertrieb.streeting.com Benutzer: xxxx Kennwort: xxxx Abrechnungssystem (im Vertriebslogin): Benutzer: xxxx Kennwort: xxxx :::::::::::::::::: SNIP second example data ::::::::::::::::: ** Message: UTF-8 valid: 1: Daten CySoTec: -------------- Jabba (XMPP) Messenger Client: Benutzer: xxxx Kennwort: xxxx Server: cysotec.info Jabba ID: [email protected] [...] :::::::::::::::::: SNIP example data end ::::::::::::::::: As far as I can see, the one with empty data is not UTF-8 valid and the other is. So, what can I do, to convert the Data from the SQL server to My app in a valid UTF-8, or on the other hand, what collation should I use in on My SQL server? Thank you alot Bernd Am Montag, den 29.12.2008, 00:47 +0100 schrieb Milosz Derezynski: > Of what type is 'result'? > > Also, could you add, before this line: > > tmp.push_back((std::string)result[row][i]); > > this code: > > Glib::ustring utf8_str(result[row][i]); > g_message("UTF-8 valid: %d: %s", int(utf8_str.validate()), > utf8_str.c_str()); > > and see what it gives? > > > M. > > P.S.: > Yes std::string and ustring are generally compatible, with the main > differences being that ustring works by-character not by-byte (e.g. > find(), operator[], etc), ustring has methods for validation of UTF-8 > and related functionality; the main potential culprit here is > operator<< and operator>> of ustring. I had really big problems with > these using boost::format() until i realised that internally, it's a > stream to which the args are fed using operator<<() of ustring. > > > On Mon, Dec 29, 2008 at 12:01 AM, Bernd Robertz > <[email protected]> wrote: > Thanks alot for your fast reply, > > I wrote a simple MySQL-Class wich is derived from the libsql++ > class. > > In this class I used std::string to get the columns of a row. > The columns (strings) are stored in a vector<string> wich I > return to > Glib::ustring in My treeview-data-window. > > Hiere are some snippets: > > :::::::::::::::::::::::: SNIP :::::::::::::::::::::: > database.cpp > (My simple MySQL database class.) > > DataBase::Database() > { > // db-connect > // query-setup > // other connect related stuff > > mysqlpp::StoreQueryResult result; // Setup the result > object > int rows; // Keep track of result counts > } > > void DataBase::returnrow(int dataid) > { > // Setup db-query with dataid to get requested db-row > // > mysqlpp::Query query = dbcon.query(queries.alldata); // > DB Query > result = query.store(); // Store the results > rows = result.num_rows(); // Set the number of results > } > > std::vector<std::string> DataBase::fetchdata(int row) > { > std::vector<std::string> tmp; // Temp vector for return > > for (int i = 0; i < result.field_names()->size(); ++i) > { > // Every column will be stored in the temp > vector > tmp.push_back((std::string)result[row][i]); > } > return tmp; // Return the temp-vector with the > [columns]=data > } > > ------------ > > datawindow.cpp > (The window in where the data is displayed after dbl-click on > treeview) > > DataWindow::DataWindow() > { > // Widgets setup > // Database connect via DataBase-Object > } > > void DataWindow::getid(int dataid) > { > // From the treeview I call this method to set the > // requested row-id > mysql.returnrow(dataid); > > // Call this method to setup the entries and textview > setdata(); > } > > void DataWindow::setdata() > { > l_dataid.set_text(mysql.fetchdata(0)[0]); > Gtk::TreeModel::Row selrow = *(ls_cbox->prepend()); > selrow[c_mod.c_cat] = mysql.fetchdata(0)[1]; > cbox.set_active(0); > > // Here comes the problem, I get every column from My > // database-object wich I store in the entries. > e_name.set_text(mysql.fetchdata(0)[2]); > e_number.set_text(mysql.fetchdata(0)[3]); > e_user.set_text(mysql.fetchdata(0)[4]); > e_pass.set_text(mysql.fetchdata(0)[5]); > e_mail.set_text(mysql.fetchdata(0)[6]); > e_url.set_text(mysql.fetchdata(0)[7]); > e_other.set_text(mysql.fetchdata(0)[8]); > > // Here we have the main problem: the textview-buffer > // Some rows are shown here, some not. > b_descr->set_text(mysql.fetchdata(0)[9]); > } > > ::::::::::::::::::::::::: SNIP > END :::::::::::::::::::::::::::: > > That is the main code where the problem occours. > > The DataWindow is called on doubleclick on a treeview-row. > With the call of the DataWindow I call the DataView::getid() > wich receive the database row-id. > Then I fill with the DataView::setdata() method the widgets > in the new window. > > Some chars are, as I told, glyphs, but the textbuffer is the > main > problem. > > As far as I know, the entries and textbuffers are expecting > Glib::ustring, but I thought the conversion from std::string > to > Glib::ustring is quite compatible between these types. > I used std::string in the database class, because I wanted to > isolated > it from Gtkmm for other not Gtkmm-related projects. > > Thank you for helping. > > Bernd > > > Am Sonntag, den 28.12.2008, 22:26 +0100 schrieb Milosz > Derezynski: > > > Are you using Glib::ustring anywhere in the process of > getting the > > data from the SQL database to the view? > > > > Glib::ustring implicitly (and in my opinion still at least > not well > > enough documented/hinted at) converts from UTF-8 > > to the current locale with operators << and >>. If you are > using a > > stringstream anywhere in the process, or are > > using operator<< or operator>> in any other way, this could > then be > > the cause of the problem. > > > > Otherwise, and in the above described case too actually it > would help > > very much if you could post (if possible, all of) > > the relevant code online. > > > > Regards, > > M. > > > > On Sun, Dec 28, 2008 at 8:53 PM, Bernd Robertz > > <[email protected]> wrote: > > Hello list, > > > > I'm not really sure, but I hope My question is in > the right > > place here. > > > > I wrote a simple database app like this: > > > > Connect to a MySQL server via libmysql++, > > and then list the rows in a treeview. > > Doubleclick on a row shows a window with some > entries and a > > textview > > with the content of the selected row. > > The textview is associated with a type text in the > DB. > > > > Everything is fine. > > > > So but I ran really into problems with the charsets. > > german umlaute (ö, ä, etc.) and some other > characters are > > glyphs in the > > treeview. Ok, thats not the main problem. > > > > That is: The entries in the detailed view still > shows the > > glyphs for > > some chars like ö, ä. > > But on some rows, the represented textbuffer for > textview is > > not > > visible. Wich means the textview is in some rows > empty. > > > > I run My app from a console and I got these error > messages: > > > > ::::::::: > > Gtk-CRITICAL **: gtk_text_buffer_emit_insert: > assertion > > `g_utf8_validate > > (text, len, NULL)' failed > > ::::::::: > > > > In other rows, the textbuffer is correct shown, > exepct some > > glyphs. > > > > If I print the textbuffer as a simple .c_str() in a > console it > > will be > > shown correctly (inklusive ä, ö, ü...). > > (Tried to show the textview as a .c_str(), without > any > > effect.) > > > > The SQL connection is serverside-configured as UTF-8 > Unicode. > > The SQL table collation is UTF-8 General CI (Case > > Insensitive). > > The Application runs on a de...@euro (ISO-8859-15). > > > > All characters are shown correctly in a PHP app wich > does the > > same, just > > only online. :-) > > > > I hope someone could turn on a light above my head, > why I > > don't get the > > right charactes. > > > > Thanks alot in advance > > > > Bernd > > > > > > _______________________________________________ > > gtkmm-list mailing list > > [email protected] > > http://mail.gnome.org/mailman/listinfo/gtkmm-list > > > > > > > > -- > > Please note that according to the German law on data > retention, > > information on every electronic information exchange with me > is > > retained for a period of six months. > > [Bitte beachten Sie, dass dem Gesetz zur > Vorratsdatenspeicherung > > zufolge > > jeder elektronische Kontakt mit mir sechs Monate lang > gespeichert > > wird.] > > > > > > -- > Please note that according to the German law on data retention, > information on every electronic information exchange with me is > retained for a period of six months. > [Bitte beachten Sie, dass dem Gesetz zur Vorratsdatenspeicherung > zufolge > jeder elektronische Kontakt mit mir sechs Monate lang gespeichert > wird.] _______________________________________________ gtkmm-list mailing list [email protected] http://mail.gnome.org/mailman/listinfo/gtkmm-list
