Re: Charsets, Gtkmm and MySQL



Hello all,

I hope everyone is well arrived in the new year.

I come back to my last post.
It seems to be, that I have some weired missconfiguration with my
charsets.
If I'm inserting a row from My gtkmm-app, it will be shown correctly in
My app, but not in other apps like my PHP webfrontend or phpMyAdmin.

I think I know how to fix it.

Has anyone suggestions wich charset should generally be used i. e. for
client and server apps (Gtkmm, webserver, db, etc.)?

Thanks everyone who give Me the flashlight to get the problem.

Many thanks

Bernd


Am Montag, den 29.12.2008, 13:09 +0100 schrieb Bernd Robertz:
> 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: xrobbi cysotec info
> [...]
> 
> :::::::::::::::::: 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
> > <bernd robertz cssweb de> 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
> >         > <bernd robertz cssweb de> 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_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
> >         >         gtkmm-list gnome org
> >         >         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
> gtkmm-list gnome org
> http://mail.gnome.org/mailman/listinfo/gtkmm-list



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]