\membersection{wxEncodingConverter::Convert}\label{wxencodingconverterconvert}
-\constfunc{void}{Convert}{\param{const char* }{input}, \param{char* }{output}}
+\constfunc{bool}{Convert}{\param{const char* }{input}, \param{char* }{output}}
-\constfunc{void}{Convert}{\param{const wchar\_t* }{input}, \param{wchar\_t* }{output}}
+\constfunc{bool}{Convert}{\param{const wchar\_t* }{input}, \param{wchar\_t* }{output}}
-\constfunc{void}{Convert}{\param{const char* }{input}, \param{wchar\_t* }{output}}
+\constfunc{bool}{Convert}{\param{const char* }{input}, \param{wchar\_t* }{output}}
-\constfunc{void}{Convert}{\param{const wchar\_t* }{input}, \param{char* }{output}}
+\constfunc{bool}{Convert}{\param{const wchar\_t* }{input}, \param{char* }{output}}
Convert input string according to settings passed to
\helpref{Init}{wxencodingconverterinit} and writes the result to {\it output}.
-\constfunc{void}{Convert}{\param{char* }{str}}
+\constfunc{bool}{Convert}{\param{char* }{str}}
-\constfunc{void}{Convert}{\param{wchar\_t* }{str}}
+\constfunc{bool}{Convert}{\param{wchar\_t* }{str}}
Convert input string according to settings passed to
\helpref{Init}{wxencodingconverterinit} in-place, i.e. write the result to the
same memory area.
+All of the versions above return \true if the conversion was lossless and
+\false if at least one of the characters couldn't be converted and was replaced
+with {\tt '?'} in the output. Note that if {\tt wxCONVERT\_SUBSTITUTE} was
+passed to \helpref{Init}{wxencodingconverterinit}, substitution is considered
+lossless operation.
+
\constfunc{wxString}{Convert}{\param{const wxString\& }{input}}
Convert wxString and return new wxString object.
// Convert input string according to settings passed to Init.
// Note that you must call Init before using Convert!
- void Convert(const char* input, char* output) const;
- void Convert(char* str) const { Convert(str, str); }
+ bool Convert(const char* input, char* output) const;
+ bool Convert(char* str) const { return Convert(str, str); }
wxString Convert(const wxString& input) const;
#if wxUSE_WCHAR_T
- void Convert(const char* input, wchar_t* output) const;
- void Convert(const wchar_t* input, char* output) const;
- void Convert(const wchar_t* input, wchar_t* output) const;
- void Convert(wchar_t* str) const { Convert(str, str); }
+ bool Convert(const char* input, wchar_t* output) const;
+ bool Convert(const wchar_t* input, char* output) const;
+ bool Convert(const wchar_t* input, wchar_t* output) const;
+ bool Convert(wchar_t* str) const { return Convert(str, str); }
#endif
// Return equivalent(s) for given font that are used
// under given platform. wxPLATFORM_CURRENT means the plaform
m_Table = new tchar[65536];
for (i = 0; i < 128; i++) m_Table[i] = (tchar)i; // 7bit ASCII
- for (i = 128; i < 65536; i++) m_Table[i] = (tchar)'?';
- // FIXME - this should be character that means `unicode to charset' impossible, not '?'
+ for (i = 128; i < 65536; i++) m_Table[i] = (tchar)0;
if (method == wxCONVERT_SUBSTITUTE)
{
}
+#define REPLACEMENT_CHAR (tchar('?'))
-void wxEncodingConverter::Convert(const char* input, char* output) const
+inline tchar GetTableValue(const tchar *table, tchar value, bool& repl)
+{
+ tchar r = table[value];
+ if (r == 0 && value != 0)
+ {
+ r = REPLACEMENT_CHAR;
+ repl = true;
+ }
+ return r;
+}
+
+
+bool wxEncodingConverter::Convert(const char* input, char* output) const
{
wxASSERT_MSG(!m_UnicodeOutput, wxT("You cannot convert to unicode if output is const char*!"));
wxASSERT_MSG(!m_UnicodeInput, wxT("You cannot convert from unicode if input is const char*!"));
if (m_JustCopy)
{
strcpy(output, input);
- return;
+ return true;
}
- wxCHECK_RET(m_Table != NULL, wxT("You must call wxEncodingConverter::Init() before actually converting!"));
+ wxCHECK_MSG(m_Table != NULL, false,
+ wxT("You must call wxEncodingConverter::Init() before actually converting!"));
+
+ bool replaced = false;
for (i = input, o = output; *i != 0;)
- *(o++) = (char)(m_Table[(wxUint8)*(i++)]);
+ *(o++) = (char)(GetTableValue(m_Table, (wxUint8)*(i++), replaced));
*o = 0;
+
+ return !replaced;
}
#if wxUSE_WCHAR_T
-void wxEncodingConverter::Convert(const char* input, wchar_t* output) const
+bool wxEncodingConverter::Convert(const char* input, wchar_t* output) const
{
wxASSERT_MSG(m_UnicodeOutput, wxT("You cannot convert to 8-bit if output is const wchar_t*!"));
wxASSERT_MSG(!m_UnicodeInput, wxT("You cannot convert from unicode if input is const char*!"));
for (i = input, o = output; *i != 0;)
*(o++) = (wchar_t)(*(i++));
*o = 0;
- return;
+ return true;
}
- wxCHECK_RET(m_Table != NULL, wxT("You must call wxEncodingConverter::Init() before actually converting!"));
+ wxCHECK_MSG(m_Table != NULL, false,
+ wxT("You must call wxEncodingConverter::Init() before actually converting!"));
+
+ bool replaced = false;
for (i = input, o = output; *i != 0;)
- *(o++) = (wchar_t)(m_Table[(wxUint8)*(i++)]);
+ *(o++) = (wchar_t)(GetTableValue(m_Table, (wxUint8)*(i++), replaced));
*o = 0;
+
+ return !replaced;
}
-void wxEncodingConverter::Convert(const wchar_t* input, char* output) const
+bool wxEncodingConverter::Convert(const wchar_t* input, char* output) const
{
wxASSERT_MSG(!m_UnicodeOutput, wxT("You cannot convert to unicode if output is const char*!"));
wxASSERT_MSG(m_UnicodeInput, wxT("You cannot convert from 8-bit if input is const wchar_t*!"));
for (i = input, o = output; *i != 0;)
*(o++) = (char)(*(i++));
*o = 0;
- return;
+ return true;
}
- wxCHECK_RET(m_Table != NULL, wxT("You must call wxEncodingConverter::Init() before actually converting!"));
+ wxCHECK_MSG(m_Table != NULL, false,
+ wxT("You must call wxEncodingConverter::Init() before actually converting!"));
+
+ bool replaced = false;
for (i = input, o = output; *i != 0;)
- *(o++) = (char)(m_Table[(wxUint16)*(i++)]);
+ *(o++) = (char)(GetTableValue(m_Table, (wxUint16)*(i++), replaced));
*o = 0;
+
+ return !replaced;
}
-void wxEncodingConverter::Convert(const wchar_t* input, wchar_t* output) const
+bool wxEncodingConverter::Convert(const wchar_t* input, wchar_t* output) const
{
wxASSERT_MSG(m_UnicodeOutput, wxT("You cannot convert to 8-bit if output is const wchar_t*!"));
wxASSERT_MSG(m_UnicodeInput, wxT("You cannot convert from 8-bit if input is const wchar_t*!"));
for (i = input, o = output; *i != 0;)
*(o++) = (*(i++));
*o = 0;
- return;
+ return true;
}
- wxCHECK_RET(m_Table != NULL, wxT("You must call wxEncodingConverter::Init() before actually converting!"));
+ wxCHECK_MSG(m_Table != NULL, false,
+ wxT("You must call wxEncodingConverter::Init() before actually converting!"));
+ bool replaced = false;
+
for (i = input, o = output; *i != 0;)
- *(o++) = (wchar_t)(m_Table[(wxUint8)*(i++)]);
+ *(o++) = (wchar_t)(GetTableValue(m_Table, (wxUint8)*(i++), replaced));
*o = 0;
+
+ return !replaced;
}
#endif // wxUSE_WCHAR_T