#if wxUSE_WCHAR_T
+class WXDLLIMPEXP_FWD_BASE wxString;
+
// the error value returned by wxMBConv methods
#define wxCONV_FAILED ((size_t)-1)
// encoding
static size_t GetMaxMBNulLen() { return 4 /* for UTF-32 */; }
+#if wxUSE_UNICODE_UTF8
+ // return true if the converter's charset is UTF-8, i.e. char* strings
+ // decoded using this object can be directly copied to wxString's internal
+ // storage without converting to WC and than back to UTF-8 MB string
+ virtual bool IsUTF8() const { return false; }
+#endif
// The old conversion functions. The existing classes currently mostly
// implement these ones but we're in transition to using To/FromWChar()
virtual size_t WC2MB(char *outputBuf, const wchar_t *psz, size_t outputSize) const;
virtual wxMBConv *Clone() const { return new wxMBConvLibc; }
+
+#if wxUSE_UNICODE_UTF8
+ virtual bool IsUTF8() const { return wxLocaleIsUtf8; }
+#endif
};
#ifdef __UNIX__
class WXDLLIMPEXP_BASE wxConvBrokenFileNames : public wxMBConv
{
public:
- wxConvBrokenFileNames(const wxChar *charset);
+ wxConvBrokenFileNames(const wxString& charset);
wxConvBrokenFileNames(const wxConvBrokenFileNames& conv)
: wxMBConv(),
m_conv(conv.m_conv ? conv.m_conv->Clone() : NULL)
return m_conv->GetMBNulLen();
}
+#if wxUSE_UNICODE_UTF8
+ virtual bool IsUTF8() const { return m_conv->IsUTF8(); }
+#endif
+
virtual wxMBConv *Clone() const { return new wxConvBrokenFileNames(*this); }
private:
// wxMBConvUTF8 (for conversion using UTF8 encoding)
// ----------------------------------------------------------------------------
-class WXDLLIMPEXP_BASE wxMBConvUTF8 : public wxMBConv
+// this is the real UTF-8 conversion class, it has to be called "strict UTF-8"
+// for compatibility reasons: the wxMBConvUTF8 class below also supports lossy
+// conversions if it is created with non default options
+class WXDLLIMPEXP_BASE wxMBConvStrictUTF8 : public wxMBConv
+{
+public:
+ // compiler-generated default ctor and other methods are ok
+
+ virtual size_t ToWChar(wchar_t *dst, size_t dstLen,
+ const char *src, size_t srcLen = wxNO_LEN) const;
+ virtual size_t FromWChar(char *dst, size_t dstLen,
+ const wchar_t *src, size_t srcLen = wxNO_LEN) const;
+
+ virtual wxMBConv *Clone() const { return new wxMBConvStrictUTF8(); }
+
+#if wxUSE_UNICODE_UTF8
+ // NB: other mapping modes are not, strictly speaking, UTF-8, so we can't
+ // take the shortcut in that case
+ virtual bool IsUTF8() const { return true; }
+#endif
+};
+
+class WXDLLIMPEXP_BASE wxMBConvUTF8 : public wxMBConvStrictUTF8
{
public:
enum
};
wxMBConvUTF8(int options = MAP_INVALID_UTF8_NOT) : m_options(options) { }
- virtual size_t MB2WC(wchar_t *outputBuf, const char *psz, size_t outputSize) const;
- virtual size_t WC2MB(char *outputBuf, const wchar_t *psz, size_t outputSize) const;
+
+ virtual size_t ToWChar(wchar_t *dst, size_t dstLen,
+ const char *src, size_t srcLen = wxNO_LEN) const;
+ virtual size_t FromWChar(char *dst, size_t dstLen,
+ const wchar_t *src, size_t srcLen = wxNO_LEN) const;
virtual wxMBConv *Clone() const { return new wxMBConvUTF8(m_options); }
+#if wxUSE_UNICODE_UTF8
+ // NB: other mapping modes are not, strictly speaking, UTF-8, so we can't
+ // take the shortcut in that case
+ virtual bool IsUTF8() const { return m_options == MAP_INVALID_UTF8_NOT; }
+#endif
+
private:
int m_options;
};
public:
// we can be created either from charset name or from an encoding constant
// but we can't have both at once
- wxCSConv(const wxChar *charset);
+ wxCSConv(const wxString& charset);
wxCSConv(wxFontEncoding encoding);
wxCSConv(const wxCSConv& conv);
virtual size_t WC2MB(char *outputBuf, const wchar_t *psz, size_t outputSize) const;
virtual size_t GetMBNulLen() const;
+#if wxUSE_UNICODE_UTF8
+ virtual bool IsUTF8() const;
+#endif
+
virtual wxMBConv *Clone() const { return new wxCSConv(*this); }
void Clear();
// set the name (may be only called when m_name == NULL), makes copy of
// charset string
- void SetName(const wxChar *charset);
+ void SetName(const char *charset);
// note that we can't use wxString here because of compilation
// dependencies: we're included from wx/string.h
- wxChar *m_name;
+ char *m_name;
wxFontEncoding m_encoding;
// use CreateConvIfNeeded() before accessing m_convReal!
// instead.
#define WX_DECLARE_GLOBAL_CONV(klass, name) \
extern WXDLLIMPEXP_DATA_BASE(klass*) name##Ptr; \
- extern klass* WXDLLIMPEXP_BASE wxGet_##name##Ptr(); \
+ extern WXDLLIMPEXP_BASE klass* wxGet_##name##Ptr(); \
inline klass& wxGet_##name() \
{ \
if ( !name##Ptr ) \
WX_DECLARE_GLOBAL_CONV(wxCSConv, wxConvISO8859_1)
#define wxConvISO8859_1 wxGet_wxConvISO8859_1()
-WX_DECLARE_GLOBAL_CONV(wxMBConvUTF8, wxConvUTF8)
+WX_DECLARE_GLOBAL_CONV(wxMBConvStrictUTF8, wxConvUTF8)
#define wxConvUTF8 wxGet_wxConvUTF8()
WX_DECLARE_GLOBAL_CONV(wxMBConvUTF7, wxConvUTF7)
// ----------------------------------------------------------------------------
// filenames are multibyte on Unix and widechar on Windows
-#if defined(__UNIX__) || defined(__WXMAC__)
- #define wxMBFILES 1
-#else
- #define wxMBFILES 0
-#endif
-
#if wxMBFILES && wxUSE_UNICODE
#define wxFNCONV(name) wxConvFileName->cWX2MB(name)
#define wxFNSTRINGCAST wxMBSTRINGCAST