]> git.saurik.com Git - wxWidgets.git/commitdiff
added conversions to/from UTF 16/32 LE/BE (patch 809685)
authorVadim Zeitlin <vadim@wxwidgets.org>
Mon, 22 Sep 2003 00:12:10 +0000 (00:12 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Mon, 22 Sep 2003 00:12:10 +0000 (00:12 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@23792 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/fontenc.h
include/wx/strconv.h
src/common/fmapbase.cpp
src/common/strconv.cpp

index deb83fd07008959575f3ced9ba2cd650839f998e..d507f4ef3cb30895fe564d6c96e792d02bb77232 100644 (file)
@@ -68,6 +68,12 @@ enum wxFontEncoding
 
     wxFONTENCODING_UTF7,            // UTF-7 Unicode encoding
     wxFONTENCODING_UTF8,            // UTF-8 Unicode encoding
+    wxFONTENCODING_UTF16,           // UTF-16 Unicode encoding
+    wxFONTENCODING_UTF16BE,         // UTF-16 Big Endian Unicode encoding
+    wxFONTENCODING_UTF16LE,         // UTF-16 Little Endian Unicode encoding
+    wxFONTENCODING_UTF32,           // UTF-32 Unicode encoding
+    wxFONTENCODING_UTF32BE,         // UTF-32 Big Endian Unicode encoding
+    wxFONTENCODING_UTF32LE,         // UTF-32 Little Endian Unicode encoding
 
     // Far Eastern encodings
         // Chinese
index aea07bb35c640a28cf854d81b90433e44828a76c..f129770ec16ab5fdfa10e14c849d4bd3d9f4d321 100644 (file)
@@ -91,6 +91,50 @@ public:
 
 WXDLLIMPEXP_DATA_BASE(extern wxMBConvUTF8) wxConvUTF8;
 
+// ----------------------------------------------------------------------------
+// wxMBConvUTF16LE (for conversion using UTF16 Little Endian encoding)
+// ----------------------------------------------------------------------------
+
+class WXDLLIMPEXP_BASE wxMBConvUTF16LE : public wxMBConv
+{
+public:
+    virtual size_t MB2WC(wchar_t *buf, const char *psz, size_t n) const;
+    virtual size_t WC2MB(char *buf, const wchar_t *psz, size_t n) const;
+};
+
+// ----------------------------------------------------------------------------
+// wxMBConvUTF16BE (for conversion using UTF16 Big Endian encoding)
+// ----------------------------------------------------------------------------
+
+class WXDLLIMPEXP_BASE wxMBConvUTF16BE : public wxMBConv
+{
+public:
+    virtual size_t MB2WC(wchar_t *buf, const char *psz, size_t n) const;
+    virtual size_t WC2MB(char *buf, const wchar_t *psz, size_t n) const;
+};
+
+// ----------------------------------------------------------------------------
+// wxMBConvUCS4LE (for conversion using UTF32 Little Endian encoding)
+// ----------------------------------------------------------------------------
+
+class WXDLLIMPEXP_BASE wxMBConvUTF32LE : public wxMBConv
+{
+public:
+    virtual size_t MB2WC(wchar_t *buf, const char *psz, size_t n) const;
+    virtual size_t WC2MB(char *buf, const wchar_t *psz, size_t n) const;
+};
+
+// ----------------------------------------------------------------------------
+// wxMBConvUCS4BE (for conversion using UTF32 Big Endian encoding)
+// ----------------------------------------------------------------------------
+
+class WXDLLIMPEXP_BASE wxMBConvUTF32BE : public wxMBConv
+{
+public:
+    virtual size_t MB2WC(wchar_t *buf, const char *psz, size_t n) const;
+    virtual size_t WC2MB(char *buf, const wchar_t *psz, size_t n) const;
+};
+
 // ----------------------------------------------------------------------------
 // wxCSConv (for conversion based on loadable char sets)
 // ----------------------------------------------------------------------------
index b49754d7f93f4faf22fe601869ad3d99b8019cab..e9b303613cdf74b7cc64aa1025a05e75a4c25324 100644 (file)
@@ -87,6 +87,12 @@ static wxFontEncoding gs_encodings[] =
     wxFONTENCODING_CP437,
     wxFONTENCODING_UTF7,
     wxFONTENCODING_UTF8,
+    wxFONTENCODING_UTF16,
+    wxFONTENCODING_UTF16BE,
+    wxFONTENCODING_UTF16LE,
+    wxFONTENCODING_UTF32,
+    wxFONTENCODING_UTF32BE,
+    wxFONTENCODING_UTF32LE,
     wxFONTENCODING_EUC_JP,
 };
 
@@ -124,6 +130,12 @@ static const wxChar* gs_encodingDescs[] =
     wxTRANSLATE( "Windows/DOS OEM (CP 437)" ),
     wxTRANSLATE( "Unicode 7 bit (UTF-7)" ),
     wxTRANSLATE( "Unicode 8 bit (UTF-8)" ),
+    wxTRANSLATE( "Unicode 16 bit (UTF-16)" ),
+    wxTRANSLATE( "Unicode 16 bit Big Endian (UTF-16BE)" ),
+    wxTRANSLATE( "Unicode 16 bit Little Endian (UTF-16LE)" ),
+    wxTRANSLATE( "Unicode 32 bit (UTF-32)" ),
+    wxTRANSLATE( "Unicode 32 bit Big Endian (UTF-32BE)" ),
+    wxTRANSLATE( "Unicode 32 bit Little Endian (UTF-32LE)" ),
     wxTRANSLATE( "Extended Unix Codepage for Japanese (EUC-JP)" ),
 };
 
@@ -161,6 +173,12 @@ static const wxChar* gs_encodingNames[] =
     wxT( "windows-437" ),
     wxT( "utf-7" ),
     wxT( "utf-8" ),
+    wxT( "utf-16" ),
+    wxT( "utf-16be" ),
+    wxT( "utf-16le" ),
+    wxT( "utf-32" ),
+    wxT( "utf-32be" ),
+    wxT( "utf-32le" ),
     wxT( "euc-jp" ),
 };
 
@@ -455,6 +473,30 @@ wxFontMapperBase::NonInteractiveCharsetToEncoding(const wxString& charset)
         {
             encoding = wxFONTENCODING_UTF8;
         }
+        else if ( cs == wxT("UTF-16") )
+        {
+            encoding = wxFONTENCODING_UTF16;
+        }
+        else if ( cs == wxT("UTF-16BE") )
+        {
+            encoding = wxFONTENCODING_UTF16BE;
+        }
+        else if ( cs == wxT("UTF-16LE") )
+        {
+            encoding = wxFONTENCODING_UTF16LE;
+        }
+        else if ( cs == wxT("UTF-32") || cs == wxT("UCS-4") )
+        {
+            encoding = wxFONTENCODING_UTF32;
+        }
+        else if ( cs == wxT("UTF-32BE") || cs == wxT("UCS-4BE") )
+        {
+            encoding = wxFONTENCODING_UTF32BE;
+        }
+        else if ( cs == wxT("UTF-32LE") || cs == wxT("UCS-4LE") )
+        {
+            encoding = wxFONTENCODING_UTF32LE;
+        }
         else if ( cs == wxT("GB2312") )
         {
             encoding = wxFONTENCODING_GB2312;
index cdbaabf73ee6bd5d17c8c489e9907b0664306150..113c02acfd93855683ca16ec42cd344e1e5c00ad 100644 (file)
@@ -143,16 +143,15 @@ IMPLEMENT_DYNAMIC_CLASS(wxStrConvModule, wxModule)
 // ============================================================================
 
 // ----------------------------------------------------------------------------
-// UTF-16 en/decoding
+// UTF-16 en/decoding to/from UCS-4
 // ----------------------------------------------------------------------------
 
-#ifdef WC_UTF16
 
-static size_t encode_utf16(wxUint32 input, wchar_t *output)
+static size_t encode_utf16(wxUint32 input, wxUint16 *output)
 {
     if (input<=0xffff)
     {
-        if (output) *output++ = (wchar_t) input;
+        if (output) *output++ = (wxUint16) input;
         return 1;
     }
     else if (input>=0x110000)
@@ -163,14 +162,14 @@ static size_t encode_utf16(wxUint32 input, wchar_t *output)
     {
         if (output)
         {
-            *output++ = (wchar_t) ((input >> 10)+0xd7c0);
-            *output++ = (wchar_t) ((input&0x3ff)+0xdc00);
+            *output++ = (wxUint16) ((input >> 10)+0xd7c0);
+            *output++ = (wxUint16) ((input&0x3ff)+0xdc00);
         }
         return 2;
     }
 }
 
-static size_t decode_utf16(const wchar_t* input, wxUint32& output)
+static size_t decode_utf16(const wxUint16* input, wxUint32& output)
 {
     if ((*input<0xd800) || (*input>0xdfff))
     {
@@ -189,7 +188,6 @@ static size_t decode_utf16(const wchar_t* input, wxUint32& output)
     }
 }
 
-#endif // WC_UTF16
 
 // ----------------------------------------------------------------------------
 // wxMBConv
@@ -266,8 +264,8 @@ const wxCharBuffer wxMBConv::cWC2MB(const wchar_t *pwz) const
         size_t nLen = WC2MB(NULL, pwz, 0);
         if ( nLen != (size_t)-1 )
         {
-            wxCharBuffer buf(nLen);
-            WC2MB(buf.data(), pwz, nLen + 1);
+            wxCharBuffer buf(nLen+3);       // space for a wxUint32 trailing zero
+            WC2MB(buf.data(), pwz, nLen + 4);
 
             return buf;
         }
@@ -422,6 +420,463 @@ size_t wxMBConvUTF8::WC2MB(char *buf, const wchar_t *psz, size_t n) const
     return len;
 }
 
+
+
+
+// ----------------------------------------------------------------------------
+// UTF-16
+// ----------------------------------------------------------------------------
+
+#ifdef WORDS_BIGENDIAN
+#define wxMBConvUTF16straight wxMBConvUTF16BE
+#define wxMBConvUTF16swap     wxMBConvUTF16LE
+#else
+#define wxMBConvUTF16swap     wxMBConvUTF16BE
+#define wxMBConvUTF16straight wxMBConvUTF16LE
+#endif
+
+
+WXDLLIMPEXP_DATA_BASE(wxMBConvUTF16LE) wxConvUTF16LE;
+WXDLLIMPEXP_DATA_BASE(wxMBConvUTF16BE) wxConvUTF16BE;
+
+
+
+
+
+#ifdef WC_UTF16
+
+
+// copy 16bit MB to 16bit String
+size_t wxMBConvUTF16straight::MB2WC(wchar_t *buf, const char *psz, size_t n) const
+{
+    size_t len=0;
+
+    while (*(wxUint16*)psz && (!buf || len < n))
+    {
+        if (buf)
+            *buf++ = *(wxUint16*)psz;
+        len++;
+
+        psz += sizeof(wxUint16);
+    }
+    if (buf && len<n)   *buf=0;
+
+    return len;
+}
+
+
+// copy 16bit String to 16bit MB
+size_t wxMBConvUTF16straight::WC2MB(char *buf, const wchar_t *psz, size_t n) const
+{
+    size_t len=0;
+
+    while (*psz && (!buf || len < n))
+    {
+        if (buf)
+        {
+            *(wxUint16*)buf = *psz;
+            buf += sizeof(wxUint16);
+        }
+        len += sizeof(wxUint16);
+        psz++;
+    }
+    if (buf && len<=n-sizeof(wxUint16))   *(wxUint16*)buf=0;
+
+    return len;
+}
+
+
+// swap 16bit MB to 16bit String
+size_t wxMBConvUTF16swap::MB2WC(wchar_t *buf, const char *psz, size_t n) const
+{
+    size_t len=0;
+
+    while (*(wxUint16*)psz && (!buf || len < n))
+    {
+        if (buf)
+        {
+            ((char *)buf)[0] = psz[1];
+            ((char *)buf)[1] = psz[0];
+            buf++;
+        }
+        len++;
+        psz += sizeof(wxUint16);
+    }
+    if (buf && len<n)   *buf=0;
+
+    return len;
+}
+
+
+// swap 16bit MB to 16bit String
+size_t wxMBConvUTF16swap::WC2MB(char *buf, const wchar_t *psz, size_t n) const
+{
+    size_t len=0;
+
+    while (*psz && (!buf || len < n))
+    {
+        if (buf)
+        {
+            *buf++ = ((char*)psz)[1];
+            *buf++ = ((char*)psz)[0];
+        }
+        len += sizeof(wxUint16);
+        psz++;
+    }
+    if (buf && len<=n-sizeof(wxUint16))   *(wxUint16*)buf=0;
+
+    return len;
+}
+
+
+#else // WC_UTF16
+
+
+// copy 16bit MB to 32bit String
+size_t wxMBConvUTF16straight::MB2WC(wchar_t *buf, const char *psz, size_t n) const
+{
+    size_t len=0;
+
+    while (*(wxUint16*)psz && (!buf || len < n))
+    {
+        wxUint32 cc;
+        size_t pa=decode_utf16((wxUint16*)psz, cc);
+        if (pa == (size_t)-1)
+            return pa;
+
+        if (buf)
+            *buf++ = cc;
+        len++;
+        psz += pa * sizeof(wxUint16);
+    }
+    if (buf && len<n)   *buf=0;
+
+    return len;
+}
+
+
+// copy 32bit String to 16bit MB
+size_t wxMBConvUTF16straight::WC2MB(char *buf, const wchar_t *psz, size_t n) const
+{
+    size_t len=0;
+
+    while (*psz && (!buf || len < n))
+    {
+        wxUint16 cc[2];
+        size_t pa=encode_utf16(*psz, cc);
+
+        if (pa == (size_t)-1)
+            return pa;
+
+        if (buf)
+        {
+            *((wxUint16*)buf)++ = cc[0];
+            if (pa > 1)
+                *((wxUint16*)buf)++ = cc[1];
+        }
+
+        len += pa*sizeof(wxUint16);
+        psz++;
+    }
+    if (buf && len<=n-sizeof(wxUint16))   *(wxUint16*)buf=0;
+
+    return len;
+}
+
+
+// swap 16bit MB to 32bit String
+size_t wxMBConvUTF16swap::MB2WC(wchar_t *buf, const char *psz, size_t n) const
+{
+    size_t len=0;
+
+    while (*(wxUint16*)psz && (!buf || len < n))
+    {
+        wxUint32 cc;
+        char tmp[4];
+        tmp[0]=psz[1];  tmp[1]=psz[0];
+        tmp[2]=psz[3];  tmp[3]=psz[2];
+
+        size_t pa=decode_utf16((wxUint16*)tmp, cc);
+        if (pa == (size_t)-1)
+            return pa;
+
+        if (buf)
+            *buf++ = cc;
+
+        len++;
+        psz += pa * sizeof(wxUint16);
+    }
+    if (buf && len<n)   *buf=0;
+
+    return len;
+}
+
+
+// swap 32bit String to 16bit MB
+size_t wxMBConvUTF16swap::WC2MB(char *buf, const wchar_t *psz, size_t n) const
+{
+    size_t len=0;
+
+    while (*psz && (!buf || len < n))
+    {
+        wxUint16 cc[2];
+        size_t pa=encode_utf16(*psz, cc);
+
+        if (pa == (size_t)-1)
+            return pa;
+
+        if (buf)
+        {
+            *buf++ = ((char*)cc)[1];
+            *buf++ = ((char*)cc)[0];
+            if (pa > 1)
+            {
+                *buf++ = ((char*)cc)[3];
+                *buf++ = ((char*)cc)[2];
+            }
+        }
+
+        len += pa*sizeof(wxUint16);
+        psz++;
+    }
+    if (buf && len<=n-sizeof(wxUint16))   *(wxUint16*)buf=0;
+
+    return len;
+}
+
+#endif // WC_UTF16
+
+
+// ----------------------------------------------------------------------------
+// UTF-32
+// ----------------------------------------------------------------------------
+
+#ifdef WORDS_BIGENDIAN
+#define wxMBConvUTF32straight  wxMBConvUTF32BE
+#define wxMBConvUTF32swap      wxMBConvUTF32LE
+#else
+#define wxMBConvUTF32swap      wxMBConvUTF32BE
+#define wxMBConvUTF32straight  wxMBConvUTF32LE
+#endif
+
+
+WXDLLIMPEXP_DATA_BASE(wxMBConvUTF32LE) wxConvUTF32LE;
+WXDLLIMPEXP_DATA_BASE(wxMBConvUTF32BE) wxConvUTF32BE;
+
+
+#ifdef WC_UTF16
+
+// copy 32bit MB to 16bit String
+size_t wxMBConvUTF32straight::MB2WC(wchar_t *buf, const char *psz, size_t n) const
+{
+    size_t len=0;
+
+    while (*(wxUint32*)psz && (!buf || len < n))
+    {
+        wxUint16 cc[2];
+
+        size_t pa=encode_utf16(*(wxUint32*)psz, cc);
+        if (pa == (size_t)-1)
+            return pa;
+
+        if (buf)
+        {
+            *buf++ = cc[0];
+            if (pa > 1)
+                *buf++ = cc[1];
+        }
+        len += pa;
+        psz += sizeof(wxUint32);
+    }
+    if (buf && len<n)   *buf=0;
+
+    return len;
+}
+
+
+// copy 16bit String to 32bit MB
+size_t wxMBConvUTF32straight::WC2MB(char *buf, const wchar_t *psz, size_t n) const
+{
+    size_t len=0;
+
+    while (*psz && (!buf || len < n))
+    {
+        wxUint32 cc;
+
+        size_t pa=decode_utf16(psz, cc);
+        if (pa == (size_t)-1)
+            return pa;
+
+        if (buf)
+        {
+            *(wxUint32*)buf = cc;
+            buf += sizeof(wxUint32);
+        }
+        len += sizeof(wxUint32);
+        psz += pa;
+    }
+    if (buf && len<=n-sizeof(wxUint32))   *(wxUint32*)buf=0;
+
+    return len;
+}
+
+
+
+// swap 32bit MB to 16bit String
+size_t wxMBConvUTF32swap::MB2WC(wchar_t *buf, const char *psz, size_t n) const
+{
+    size_t len=0;
+
+    while (*(wxUint32*)psz && (!buf || len < n))
+    {
+        char tmp[4];
+        tmp[0] = psz[3];   tmp[1] = psz[2];
+        tmp[2] = psz[1];   tmp[3] = psz[0];
+
+
+        wxUint16 cc[2];
+
+        size_t pa=encode_utf16(*(wxUint32*)tmp, cc);
+        if (pa == (size_t)-1)
+            return pa;
+
+        if (buf)
+        {
+            *buf++ = cc[0];
+            if (pa > 1)
+                *buf++ = cc[1];
+        }
+        len += pa;
+        psz += sizeof(wxUint32);
+    }
+    if (buf && len<n)   *buf=0;
+
+    return len;
+}
+
+
+// swap 16bit String to 32bit MB
+size_t wxMBConvUTF32swap::WC2MB(char *buf, const wchar_t *psz, size_t n) const
+{
+    size_t len=0;
+
+    while (*psz && (!buf || len < n))
+    {
+        char cc[4];
+
+        size_t pa=decode_utf16(psz, *(wxUint32*)cc);
+        if (pa == (size_t)-1)
+            return pa;
+
+        if (buf)
+        {
+            *buf++ = cc[3];
+            *buf++ = cc[2];
+            *buf++ = cc[1];
+            *buf++ = cc[0];
+        }
+        len += sizeof(wxUint32);
+        psz += pa;
+    }
+    if (buf && len<=n-sizeof(wxUint32))   *(wxUint32*)buf=0;
+
+    return len;
+}
+
+#else // WC_UTF16
+
+
+// copy 32bit MB to 32bit String
+size_t wxMBConvUTF32straight::MB2WC(wchar_t *buf, const char *psz, size_t n) const
+{
+    size_t len=0;
+
+    while (*(wxUint32*)psz && (!buf || len < n))
+    {
+        if (buf)
+            *buf++ = *(wxUint32*)psz;
+        len++;
+        psz += sizeof(wxUint32);
+    }
+    if (buf && len<n)   *buf=0;
+
+    return len;
+}
+
+
+// copy 32bit String to 32bit MB
+size_t wxMBConvUTF32straight::WC2MB(char *buf, const wchar_t *psz, size_t n) const
+{
+    size_t len=0;
+
+    while (*psz && (!buf || len < n))
+    {
+        if (buf)
+        {
+            *(wxUint32*)buf = *psz;
+            buf += sizeof(wxUint32);
+        }
+
+        len += sizeof(wxUint32);
+        psz++;
+    }
+
+    if (buf && len<=n-sizeof(wxUint32))   *(wxUint32*)buf=0;
+
+    return len;
+}
+
+
+// swap 32bit MB to 32bit String
+size_t wxMBConvUTF32swap::MB2WC(wchar_t *buf, const char *psz, size_t n) const
+{
+    size_t len=0;
+
+    while (*(wxUint32*)psz && (!buf || len < n))
+    {
+        if (buf)
+        {
+            ((char *)buf)[0] = psz[3];
+            ((char *)buf)[1] = psz[2];
+            ((char *)buf)[2] = psz[1];
+            ((char *)buf)[3] = psz[0];
+            buf++;
+        }
+        len++;
+        psz += sizeof(wxUint32);
+    }
+    if (buf && len<n)   *buf=0;
+
+    return len;
+}
+
+
+// swap 32bit String to 32bit MB
+size_t wxMBConvUTF32swap::WC2MB(char *buf, const wchar_t *psz, size_t n) const
+{
+    size_t len=0;
+
+    while (*psz && (!buf || len < n))
+    {
+        if (buf)
+        {
+            *buf++ = ((char *)psz)[3];
+            *buf++ = ((char *)psz)[2];
+            *buf++ = ((char *)psz)[1];
+            *buf++ = ((char *)psz)[0];
+        }
+        len += sizeof(wxUint32);
+        psz++;
+    }
+    if (buf && len<=n-sizeof(wxUint32))   *(wxUint32*)buf=0;
+
+    return len;
+}
+
+
+#endif // WC_UTF16
+
+
 // ============================================================================
 // wxCharacterSet and derived classes
 // ============================================================================
@@ -891,27 +1346,72 @@ wxGetCharacterSet(const wxChar *name, wxFontEncoding encoding)
         return NULL;
     }
 
-    wxCharacterSet *cset;
+    wxCharacterSet *cset = NULL;
 
-    if ( (name &&
-            (wxStricmp(name, wxT("UTF8")) == 0 ||
-             wxStricmp(name, wxT("UTF-8")) == 0)) ||
-          encoding == wxFONTENCODING_UTF8 )
-    {
-        cset = new ID_CharSet(&wxConvUTF8);
-    }
-    else // !UTF-8
+    if (name)
     {
-#ifdef HAVE_ICONV
-        if ( name )
+        if((wxStricmp(name, wxT("UTF8")) == 0)  ||
+           (wxStricmp(name, wxT("UTF-8")) == 0) ||
+            encoding == wxFONTENCODING_UTF8 )
         {
-            cset = new IC_CharSet(name);
+            cset = new ID_CharSet(&wxConvUTF8);
+        }
+        else if((wxStricmp(name, wxT("UTF16")) == 0)  ||
+           (wxStricmp(name, wxT("UTF-16")) == 0) ||
+            encoding == wxFONTENCODING_UTF16 )
+        {
+#ifdef WORDS_BIGENDIAN
+            cset = new ID_CharSet(&wxConvUTF16BE);
+#else
+            cset = new ID_CharSet(&wxConvUTF16LE);
+#endif
+        }
+        else if((wxStricmp(name, wxT("UTF16BE")) == 0)  ||
+           (wxStricmp(name, wxT("UTF-16BE")) == 0) ||
+            encoding == wxFONTENCODING_UTF16BE )
+        {
+            cset = new ID_CharSet(&wxConvUTF16BE);
+        }
+        else if((wxStricmp(name, wxT("UTF16LE")) == 0)  ||
+           (wxStricmp(name, wxT("UTF-16LE")) == 0) ||
+            encoding == wxFONTENCODING_UTF16LE )
+        {
+            cset = new ID_CharSet(&wxConvUTF16LE);
+        }
+        else if((wxStricmp(name, wxT("UTF32")) == 0)  ||
+           (wxStricmp(name, wxT("UTF-32")) == 0) ||
+           (wxStricmp(name, wxT("UCS4")) == 0) ||
+           (wxStricmp(name, wxT("UCS-4")) == 0) ||
+            encoding == wxFONTENCODING_UTF32 )
+        {
+#ifdef WORDS_BIGENDIAN
+            cset = new ID_CharSet(&wxConvUTF32BE);
+#else
+            cset = new ID_CharSet(&wxConvUTF32LE);
+#endif
         }
+        else if((wxStricmp(name, wxT("UTF32BE")) == 0)  ||
+           (wxStricmp(name, wxT("UTF-32BE")) == 0) ||
+           (wxStricmp(name, wxT("UCS4BE")) == 0) ||
+           (wxStricmp(name, wxT("UCS-4BE")) == 0) ||
+            encoding == wxFONTENCODING_UTF32BE )
+        {
+            cset = new ID_CharSet(&wxConvUTF32BE);
+        }
+        else if((wxStricmp(name, wxT("UTF32LE")) == 0)  ||
+           (wxStricmp(name, wxT("UTF-32LE")) == 0) ||
+           (wxStricmp(name, wxT("UCS4LE")) == 0) ||
+           (wxStricmp(name, wxT("UCS-4LE")) == 0) ||
+            encoding == wxFONTENCODING_UTF32 )
+        {
+            cset = new ID_CharSet(&wxConvUTF32LE);
+        }
+#ifdef HAVE_ICONV
         else
-#endif // HAVE_ICONV
         {
-            cset = NULL;
+            cset = new IC_CharSet(name);
         }
+#endif // HAVE_ICONV
     }
 
     // it can only be NULL in this case