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:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -172,25 +172,48 @@ 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()"));
|
||||||
|
|
||||||
wxWCharBuffer wbuf;
|
// but still try to show at least something on the screen
|
||||||
if ( enc == wxFONTENCODING_SYSTEM || enc == wxFONTENCODING_DEFAULT )
|
wxMBConvUTF8 utf8permissive(wxMBConvUTF8::MAP_INVALID_UTF8_TO_OCTAL);
|
||||||
{
|
wxWCharBuffer wbuf(utf8permissive.cMB2WC(s));
|
||||||
wbuf = wxConvUI->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 )
|
||||||
if ( wbuf )
|
buf = wxConvUTF8.cWC2MB(wbuf);
|
||||||
buf = wxConvUTF8.cWC2MB(wbuf);
|
}
|
||||||
|
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user