+ ms_wcNeedsSwap = FALSE;
+
+ // try charset with explicit bytesex info (e.g. "UCS-4LE"):
+ ms_wcCharsetName = WC_NAME_BEST;
+ m2w = iconv_open(ms_wcCharsetName, cname);
+
+ if (m2w == (iconv_t)-1)
+ {
+ // try charset w/o bytesex info (e.g. "UCS4")
+ // and check for bytesex ourselves:
+ ms_wcCharsetName = WC_NAME;
+ m2w = iconv_open(ms_wcCharsetName, cname);
+
+ // last bet, try if it knows WCHAR_T pseudo-charset
+ if (m2w == (iconv_t)-1)
+ {
+ ms_wcCharsetName = "WCHAR_T";
+ m2w = iconv_open(ms_wcCharsetName, cname);
+ }
+
+ if (m2w != (iconv_t)-1)
+ {
+ char buf[2], *bufPtr;
+ wchar_t wbuf[2], *wbufPtr;
+ size_t insz, outsz;
+ size_t res;
+
+ buf[0] = 'A';
+ buf[1] = 0;
+ wbuf[0] = 0;
+ insz = 2;
+ outsz = SIZEOF_WCHAR_T * 2;
+ wbufPtr = wbuf;
+ bufPtr = buf;
+
+ res = iconv(m2w, ICONV_CHAR_CAST(&bufPtr), &insz,
+ (char**)&wbufPtr, &outsz);
+
+ if (ICONV_FAILED(res, insz))
+ {
+ ms_wcCharsetName = NULL;
+ wxLogLastError(wxT("iconv"));
+ wxLogError(_("Convertion to charset '%s' doesn't work."), name);
+ }
+ else
+ {
+ ms_wcNeedsSwap = wbuf[0] != (wchar_t)buf[0];
+ }
+ }
+ else
+ {
+ ms_wcCharsetName = NULL;
+
+ // VS: we must not output an error here, since wxWindows will safely
+ // fall back to using wxEncodingConverter.
+ wxLogTrace(wxT("strconv"), wxT("Impossible to convert to/from charset '%s' with iconv, falling back to wxEncodingConverter."), name);
+ //wxLogError(
+ }
+ }
+ wxLogTrace(wxT("strconv"), wxT("wchar_t charset is '%s', needs swap: %i"), ms_wcCharsetName, ms_wcNeedsSwap);