// Purpose: wxUniChar and wxUniCharRef classes
// Author: Vaclav Slavik
// Created: 2007-03-19
-// RCS-ID: $Id$
// Copyright: (c) 2007 REA Elektronik GmbH
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
return wxT('?'); // FIXME-UTF8: what to use as failure character?
#else
- wchar_t buf[2];
- if ( wxConvLibc.ToWChar(buf, 2, &c, 1) != 2 )
+ char cbuf[2];
+ cbuf[0] = c;
+ cbuf[1] = '\0';
+ wchar_t wbuf[2];
+ if ( wxConvLibc.ToWChar(wbuf, 2, cbuf, 2) != 2 )
{
wxFAIL_MSG( "invalid multibyte character" );
return wxT('?'); // FIXME-UTF8: what to use as failure character?
}
- return buf[0];
+ return wbuf[0];
#endif
}
/* static */
-char wxUniChar::ToHi8bit(wxUniChar::value_type c)
+char wxUniChar::ToHi8bit(wxUniChar::value_type v)
{
-#if wxUSE_UTF8_LOCALE_ONLY
- wxFAIL_MSG( "character cannot be converted to single UTF-8 byte" );
- wxUnusedVar(c);
-
- return '?'; // FIXME-UTF8: what to use as failure character?
-#else
- wchar_t in = c;
- char buf[2];
- if ( wxConvLibc.FromWChar(buf, 2, &in, 1) != 2 )
+ char c;
+ if ( !GetAsHi8bit(v, &c) )
{
wxFAIL_MSG( "character cannot be converted to single byte" );
- return '?'; // FIXME-UTF8: what to use as failure character?
+ c = '?'; // FIXME-UTF8: what to use as failure character?
}
- return buf[0];
-#endif
+
+ return c;
}
+/* static */
+bool wxUniChar::GetAsHi8bit(value_type v, char *c)
+{
+ wchar_t wbuf[2];
+ wbuf[0] = v;
+ wbuf[1] = L'\0';
+ char cbuf[2];
+ if ( wxConvLibc.FromWChar(cbuf, 2, wbuf, 2) != 2 )
+ return false;
+
+ *c = cbuf[0];
+ return true;
+}
// ---------------------------------------------------------------------------
// wxUniCharRef
for ( size_t i = 0; i < lenNew; ++i, ++pos )
*pos = utf[i];
}
- else
+ else // length of character encoding in UTF-8 changed
{
// the worse case is when the new value has either longer or shorter
// code -- in that case, we have to use wxStringImpl::replace() and
if ( iterNum == STATIC_SIZE )
{
- wxLogTrace( _T("utf8"), _T("unexpectedly many iterators") );
+ wxLogTrace( wxT("utf8"), wxT("unexpectedly many iterators") );
size_t total = iterNum + 1;
for ( wxStringIteratorNode *it2 = it; it2; it2 = it2->m_next )
// update the string:
strimpl.replace(m_pos, m_pos + lenOld, utf, lenNew);
+#if wxUSE_STRING_POS_CACHE
+ m_str.InvalidateCache();
+#endif // wxUSE_STRING_POS_CACHE
+
// finally, set the iterators to valid values again (note that this
// updates m_pos as well):
size_t i;