From 404ac4c67da7d9a454e0c0a64395e024d92a2253 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Mon, 26 Feb 2007 09:53:15 +0000 Subject: [PATCH] interpret text invalid in the current encoding (typical for UTF-8 environments) as ISO8859-1, this is wrong but better than eating it completely git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@44567 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/gtk/utilsgtk.cpp | 54 +++++++++++++------------------------------- 1 file changed, 16 insertions(+), 38 deletions(-) diff --git a/src/gtk/utilsgtk.cpp b/src/gtk/utilsgtk.cpp index f9c83e3166..72757f441b 100644 --- a/src/gtk/utilsgtk.cpp +++ b/src/gtk/utilsgtk.cpp @@ -185,50 +185,28 @@ wxWindow* wxFindWindowAtPoint(const wxPoint& pt) wxCharBuffer wxConvertToGTK(const wxString& s, wxFontEncoding enc) { - wxCharBuffer buf; - if ( enc == wxFONTENCODING_UTF8 ) + wxWCharBuffer wbuf; + if ( enc == wxFONTENCODING_SYSTEM || enc == wxFONTENCODING_DEFAULT ) { - // 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); - } + wbuf = wxConvUI->cMB2WC(s); } - else // !UTF-8 + else // another encoding, use generic conversion class { - 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); - } + wbuf = wxCSConv(enc).cMB2WC(s); + } - if ( wbuf ) - buf = wxConvUTF8.cWC2MB(wbuf); + if ( !wbuf && !s.empty() ) + { + // conversion failed, but we still want to show something to the user + // even if it's going to be wrong it is better than nothing + // + // we choose ISO8859-1 here arbitrarily, it's just the most common + // encoding probably and, also importantly here, conversion from it + // never fails as it's done internally by wxCSConv + wbuf = wxCSConv(wxFONTENCODING_ISO8859_1).cMB2WC(s); } - return buf; + return wxConvUTF8.cWC2MB(wbuf); } #endif // !wxUSE_UNICODE -- 2.45.2