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
This commit is contained in:
Vadim Zeitlin
2006-08-24 17:50:10 +00:00
parent a6e8c584db
commit 27dee9ae02
2 changed files with 39 additions and 14 deletions

View File

@@ -846,7 +846,9 @@ void wxTextCtrl::SetValue( const wxString &value )
const wxCharBuffer buffer(wxGTK_CONV_ENC(value, GetTextEncoding())); const wxCharBuffer buffer(wxGTK_CONV_ENC(value, GetTextEncoding()));
if ( !buffer ) 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; return;
} }

View File

@@ -172,12 +172,35 @@ wxWindow* wxFindWindowAtPoint(const wxPoint& pt)
wxCharBuffer wxConvertToGTK(const wxString& s, wxFontEncoding enc) wxCharBuffer wxConvertToGTK(const wxString& s, wxFontEncoding enc)
{ {
wxCharBuffer buf;
if ( enc == wxFONTENCODING_UTF8 ) if ( enc == wxFONTENCODING_UTF8 )
{ {
// no need for conversion at all // no need for conversion at all, but do check that we have a valid
return wxCharBuffer(s); // 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 // !UTF-8
{
wxWCharBuffer wbuf; wxWCharBuffer wbuf;
if ( enc == wxFONTENCODING_SYSTEM || enc == wxFONTENCODING_DEFAULT ) if ( enc == wxFONTENCODING_SYSTEM || enc == wxFONTENCODING_DEFAULT )
{ {
@@ -188,9 +211,9 @@ wxCharBuffer wxConvertToGTK(const wxString& s, wxFontEncoding enc)
wbuf = wxCSConv(enc).cMB2WC(s); wbuf = wxCSConv(enc).cMB2WC(s);
} }
wxCharBuffer buf;
if ( wbuf ) if ( wbuf )
buf = wxConvUTF8.cWC2MB(wbuf); buf = wxConvUTF8.cWC2MB(wbuf);
}
return buf; return buf;
} }