From: Vadim Zeitlin Date: Thu, 24 Aug 2006 17:50:10 +0000 (+0000) Subject: try to deal more gracefully (than simply not showing anything at all) with invalid... X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/27dee9ae02f0afc054fe7a90bc3d077df1d7914a?hp=a6e8c584db192eb20651c16a6443535a059e4afe try to deal more gracefully (than simply not showing anything at all) with invalid UTF-8 strings (e.g. ISO-8859-1 strings inserted in controls with default (UTF-8) font git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@40800 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/gtk/textctrl.cpp b/src/gtk/textctrl.cpp index 1c599667a9..64a6796cb5 100644 --- a/src/gtk/textctrl.cpp +++ b/src/gtk/textctrl.cpp @@ -846,7 +846,9 @@ void wxTextCtrl::SetValue( const wxString &value ) const wxCharBuffer buffer(wxGTK_CONV_ENC(value, GetTextEncoding())); if ( !buffer ) { - // what else can we do? at least don't crash... + // see comment in WriteText() as to why we must warn the user about + // this + wxLogWarning(_("Failed to set text in the text control.")); return; } diff --git a/src/gtk/utilsgtk.cpp b/src/gtk/utilsgtk.cpp index 4ffa937042..ae645105e1 100644 --- a/src/gtk/utilsgtk.cpp +++ b/src/gtk/utilsgtk.cpp @@ -172,25 +172,48 @@ wxWindow* wxFindWindowAtPoint(const wxPoint& pt) wxCharBuffer wxConvertToGTK(const wxString& s, wxFontEncoding enc) { + wxCharBuffer buf; if ( enc == wxFONTENCODING_UTF8 ) { - // no need for conversion at all - return wxCharBuffer(s); - } - - wxWCharBuffer wbuf; - if ( enc == wxFONTENCODING_SYSTEM || enc == wxFONTENCODING_DEFAULT ) - { - wbuf = wxConvUI->cMB2WC(s); + // no need for conversion at all, but do check that we have a valid + // UTF-8 string because passing invalid UTF-8 to GTK+ is going to + // result in a GTK+ error message and, especially, loss of data which + // was supposed to be shown in the GUI + if ( wxConvUTF8.ToWChar(NULL, 0, s, s.length()) == wxCONV_FAILED ) + { + // warn the programmer that something is probably wrong in his code + // + // NB: don't include the string in output because chances are that + // this invalid UTF-8 string could result in more errors itself + // if the application shows logs in the GUI and so we get into + // an infinite loop + wxLogDebug(_T("Invalid UTF-8 string in wxConvertToGTK()")); + + // but still try to show at least something on the screen + wxMBConvUTF8 utf8permissive(wxMBConvUTF8::MAP_INVALID_UTF8_TO_OCTAL); + wxWCharBuffer wbuf(utf8permissive.cMB2WC(s)); + buf = wxConvUTF8.cWC2MB(wbuf); + } + else // valid UTF-8 string, no need to convert + { + buf = wxCharBuffer(s); + } } - else // another encoding, use generic conversion class + else // !UTF-8 { - wbuf = wxCSConv(enc).cMB2WC(s); - } + wxWCharBuffer wbuf; + if ( enc == wxFONTENCODING_SYSTEM || enc == wxFONTENCODING_DEFAULT ) + { + wbuf = wxConvUI->cMB2WC(s); + } + else // another encoding, use generic conversion class + { + wbuf = wxCSConv(enc).cMB2WC(s); + } - wxCharBuffer buf; - if ( wbuf ) - buf = wxConvUTF8.cWC2MB(wbuf); + if ( wbuf ) + buf = wxConvUTF8.cWC2MB(wbuf); + } return buf; }