From: Vadim Zeitlin Date: Fri, 25 Jan 2002 14:29:33 +0000 (+0000) Subject: fixes to handling of the 7 bit ASCII encoding X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/cafbf6fb1f450c26823544bbd31cf87f87a1cbed?ds=inline fixes to handling of the 7 bit ASCII encoding git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@13799 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/font.h b/include/wx/font.h index a95b73d002..26e0b6ff92 100644 --- a/include/wx/font.h +++ b/include/wx/font.h @@ -143,10 +143,8 @@ public: // the default encoding is used for creating all fonts with default // encoding parameter - static wxFontEncoding GetDefaultEncoding() - { return ms_encodingDefault; } - static void SetDefaultEncoding(wxFontEncoding encoding) - { ms_encodingDefault = encoding; } + static wxFontEncoding GetDefaultEncoding() { return ms_encodingDefault; } + static void SetDefaultEncoding(wxFontEncoding encoding); protected: // get the internal data diff --git a/src/common/fontcmn.cpp b/src/common/fontcmn.cpp index 320d37935e..50b3b19db8 100644 --- a/src/common/fontcmn.cpp +++ b/src/common/fontcmn.cpp @@ -49,6 +49,17 @@ wxFontEncoding wxFontBase::ms_encodingDefault = wxFONTENCODING_SYSTEM; +/* static */ +void wxFontBase::SetDefaultEncoding(wxFontEncoding encoding) +{ + // GetDefaultEncoding() should return something != wxFONTENCODING_DEFAULT + // and, besides, using this value here doesn't make any sense + wxCHECK_RET( encoding != wxFONTENCODING_DEFAULT, + _T("can't set default encoding to wxFONTENCODING_DEFAULT") ); + + ms_encodingDefault = encoding; +} + wxFontBase::~wxFontBase() { // this destructor is required for Darwin diff --git a/src/common/fontmap.cpp b/src/common/fontmap.cpp index 170d32aedd..6ab97b4c2f 100644 --- a/src/common/fontmap.cpp +++ b/src/common/fontmap.cpp @@ -489,10 +489,7 @@ wxFontEncoding wxFontMapper::CharsetToEncoding(const wxString& charset, cs.MakeUpper(); - // nl_langinfo() under Solaris returns 646 by default which stands for - // ISO-646, i.e. 7 bit ASCII and we should recognize it to avoid - // warnings about unrecognized encoding on each program startup - if ( cs.empty() || cs == _T("US-ASCII") || cs == _T("646") ) + if ( cs.empty() || cs == _T("US-ASCII") ) { encoding = wxFONTENCODING_DEFAULT; } diff --git a/src/common/strconv.cpp b/src/common/strconv.cpp index 17a15ca5a8..0631cb5b68 100644 --- a/src/common/strconv.cpp +++ b/src/common/strconv.cpp @@ -858,8 +858,9 @@ public: { if (name) enc = wxTheFontMapper->CharsetToEncoding(name, FALSE); - m2w.Init(enc, wxFONTENCODING_UNICODE); - w2m.Init(wxFONTENCODING_UNICODE, enc); + + m_ok = m2w.Init(enc, wxFONTENCODING_UNICODE) && + w2m.Init(wxFONTENCODING_UNICODE, enc); } size_t MB2WC(wchar_t *buf, const char *psz, size_t n) @@ -884,12 +885,14 @@ public: return inbuf; } - bool usable() const - { return (enc!=wxFONTENCODING_SYSTEM) && (enc!=wxFONTENCODING_DEFAULT); } + bool usable() const { return m_ok; } public: wxFontEncoding enc; wxEncodingConverter m2w, w2m; + + // were we initialized successfully? + bool m_ok; }; #endif // wxUSE_FONTMAP @@ -901,46 +904,61 @@ public: static wxCharacterSet *wxGetCharacterSet(const wxChar *name) { - wxCharacterSet *cset = NULL; - if (name) + // check for the special case of ASCII charset +#if wxUSE_FONTMAP + if ( wxTheFontMapper->CharsetToEncoding(name) == wxFONTENCODING_DEFAULT ) +#else // wxUSE_FONTMAP + if ( !name ) +#endif // wxUSE_FONTMAP/!wxUSE_FONTMAP { - if (wxStricmp(name, wxT("UTF8")) == 0 || wxStricmp(name, wxT("UTF-8")) == 0) - { - cset = new ID_CharSet(name, &wxConvUTF8); - } - else - { -#ifdef HAVE_ICONV - cset = new IC_CharSet(name); // may not take NULL -#endif - } + // don't convert at all + return NULL; } - if (cset && cset->usable()) - return cset; + // the test above must have taken care of this case + wxCHECK_MSG( name, NULL, _T("NULL name must be wxFONTENCODING_DEFAULT") ); - if (cset) + wxCharacterSet *cset; + + if ( wxStricmp(name, wxT("UTF8")) == 0 || wxStricmp(name, wxT("UTF-8")) == 0) + { + cset = new ID_CharSet(name, &wxConvUTF8); + } + else { - delete cset; +#ifdef HAVE_ICONV + cset = new IC_CharSet(name); +#else // !HAVE_ICONV cset = NULL; +#endif // HAVE_ICONV/!HAVE_ICONV } + if ( cset->usable() ) + return cset; + + delete cset; + cset = NULL; + #if defined(__WIN32__) && !defined(__WXMICROWIN__) - cset = new CP_CharSet(name); // may take NULL - if (cset->usable()) + cset = new CP_CharSet(name); + if ( cset->usable() ) return cset; delete cset; + cset = NULL; #endif // __WIN32__ #if wxUSE_FONTMAP cset = new EC_CharSet(name); - if (cset->usable()) + if ( cset->usable() ) return cset; -#endif // wxUSE_FONTMAP delete cset; - wxLogError(_("Unknown encoding '%s'!"), name); + cset = NULL; +#endif // wxUSE_FONTMAP + + wxLogError(_("Cannot convert from encoding '%s'!"), name); + return NULL; }