+#endif // wxUSE_UNICODE_WCHAR
+
+#if wxUSE_UNICODE_UTF8
+/* static */
+wxString::SubstrBufFromMB wxString::ConvertStr(const char *psz, size_t nLength,
+ const wxMBConv& conv)
+{
+ // FIXME-UTF8: return as-is without copying under UTF8 locale, return
+ // converted string under other locales - needs wxCharBuffer
+ // changes
+
+ // anything to do?
+ if ( !psz || nLength == 0 )
+ return SubstrBufFromMB("", 0);
+
+ if ( nLength == npos )
+ nLength = wxNO_LEN;
+
+ // first convert to wide string:
+ size_t wcLen;
+ wxWCharBuffer wcBuf(conv.cMB2WC(psz, nLength, &wcLen));
+ if ( !wcLen )
+ return SubstrBufFromMB("", 0);
+
+ // and then to UTF-8:
+ SubstrBufFromMB buf(ConvertStr(wcBuf, wcLen, wxConvUTF8));
+ // widechar -> UTF-8 conversion isn't supposed to ever fail:
+ wxASSERT_MSG( buf.data, _T("conversion to UTF-8 failed") );
+
+ return buf;
+}
+#endif // wxUSE_UNICODE_UTF8
+
+#if wxUSE_UNICODE_UTF8 || !wxUSE_UNICODE