git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@45533 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
100 lines
2.8 KiB
C++
100 lines
2.8 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// Name: src/common/unichar.cpp
|
|
// Purpose: wxUniChar and wxUniCharRef classes
|
|
// Author: Vaclav Slavik
|
|
// Created: 2007-03-19
|
|
// RCS-ID: $Id$
|
|
// Copyright: (c) 2007 REA Elektronik GmbH
|
|
// Licence: wxWindows licence
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
// ===========================================================================
|
|
// headers
|
|
// ===========================================================================
|
|
|
|
// For compilers that support precompilation, includes "wx.h".
|
|
#include "wx/wxprec.h"
|
|
|
|
#ifdef __BORLANDC__
|
|
#pragma hdrstop
|
|
#endif
|
|
|
|
#ifndef WX_PRECOMP
|
|
#include "wx/strconv.h" // wxConvLibc
|
|
#endif
|
|
|
|
#include "wx/unichar.h"
|
|
#include "wx/stringops.h"
|
|
|
|
// ===========================================================================
|
|
// implementation
|
|
// ===========================================================================
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// wxUniChar
|
|
// ---------------------------------------------------------------------------
|
|
|
|
/* static */
|
|
wxUniChar::value_type wxUniChar::From8bit(char c)
|
|
{
|
|
// all supported charsets have the first 128 characters same as ASCII:
|
|
if ( (unsigned char)c < 0x80 )
|
|
return c;
|
|
|
|
wchar_t buf[2];
|
|
if ( wxConvLibc.ToWChar(buf, 2, &c, 1) != 2 )
|
|
return wxT('?'); // FIXME-UTF8: what to use as failure character?
|
|
return buf[0];
|
|
}
|
|
|
|
/* static */
|
|
char wxUniChar::To8bit(wxUniChar::value_type c)
|
|
{
|
|
// all supported charsets have the first 128 characters same as ASCII:
|
|
if ( c < 0x80 )
|
|
return c;
|
|
|
|
wchar_t in = c;
|
|
char buf[2];
|
|
if ( wxConvLibc.FromWChar(buf, 2, &in, 1) != 2 )
|
|
return '?'; // FIXME-UTF8: what to use as failure character?
|
|
return buf[0];
|
|
}
|
|
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// wxUniCharRef
|
|
// ---------------------------------------------------------------------------
|
|
|
|
#if wxUSE_UNICODE_UTF8
|
|
wxUniChar wxUniCharRef::UniChar() const
|
|
{
|
|
return wxStringOperations::DecodeChar(m_pos);
|
|
}
|
|
|
|
wxUniCharRef& wxUniCharRef::operator=(const wxUniChar& c)
|
|
{
|
|
wxStringOperations::Utf8CharBuffer utf(wxStringOperations::EncodeChar(c));
|
|
size_t lenOld = wxStringOperations::GetUtf8CharLength(*m_pos);
|
|
size_t lenNew = wxStringOperations::GetUtf8CharLength(utf[0]);
|
|
|
|
if ( lenNew == lenOld )
|
|
{
|
|
iterator pos(m_pos);
|
|
for ( size_t i = 0; i < lenNew; ++i, ++pos )
|
|
*pos = utf[i];
|
|
}
|
|
else
|
|
{
|
|
size_t idx = m_pos - m_str.begin();
|
|
|
|
m_str.replace(m_pos, m_pos + lenOld, utf, lenNew);
|
|
|
|
// this is needed to keep m_pos valid:
|
|
m_pos = m_str.begin() + idx;
|
|
}
|
|
|
|
return *this;
|
|
}
|
|
#endif // wxUSE_UNICODE_UTF8
|