Very incomplete Unicode support for wxTextStream.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_4_BRANCH@17414 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling
2002-09-30 20:48:44 +00:00
parent b1b937339c
commit 58b5a13da5
2 changed files with 54 additions and 5 deletions

View File

@@ -28,10 +28,15 @@ typedef wxTextOutputStream& (*__wxTextOutputManip)(wxTextOutputStream&);
WXDLLEXPORT wxTextOutputStream &endl( wxTextOutputStream &stream ); WXDLLEXPORT wxTextOutputStream &endl( wxTextOutputStream &stream );
class WXDLLEXPORT wxTextInputStream class WXDLLEXPORT wxTextInputStream
{ {
public: public:
#if wxUSE_UNICODE
wxTextInputStream(wxInputStream& s, const wxString &sep=wxT(" \t"), wxMBConv& conv = wxConvUTF8 );
#else
wxTextInputStream(wxInputStream& s, const wxString &sep=wxT(" \t") ); wxTextInputStream(wxInputStream& s, const wxString &sep=wxT(" \t") );
#endif
~wxTextInputStream(); ~wxTextInputStream();
wxUint32 Read32(); wxUint32 Read32();
@@ -61,12 +66,17 @@ protected:
wxInputStream &m_input; wxInputStream &m_input;
wxString m_separators; wxString m_separators;
#if wxUSE_UNICODE
wxMBConv &m_conv;
#endif
bool EatEOL(const wxChar &c); bool EatEOL(const wxChar &c);
wxChar NextNonSeparators(); wxChar NextNonSeparators();
void SkipIfEndOfLine( wxChar c ); void SkipIfEndOfLine( wxChar c );
}; };
typedef enum { typedef enum
{
wxEOL_NATIVE, wxEOL_NATIVE,
wxEOL_UNIX, wxEOL_UNIX,
wxEOL_MAC, wxEOL_MAC,
@@ -76,7 +86,11 @@ typedef enum {
class WXDLLEXPORT wxTextOutputStream class WXDLLEXPORT wxTextOutputStream
{ {
public: public:
#if wxUSE_UNICODE
wxTextOutputStream( wxOutputStream& s, wxEOL mode = wxEOL_NATIVE, wxMBConv& conv = wxConvUTF8 );
#else
wxTextOutputStream( wxOutputStream& s, wxEOL mode = wxEOL_NATIVE ); wxTextOutputStream( wxOutputStream& s, wxEOL mode = wxEOL_NATIVE );
#endif
virtual ~wxTextOutputStream(); virtual ~wxTextOutputStream();
void SetMode( wxEOL mode = wxEOL_NATIVE ); void SetMode( wxEOL mode = wxEOL_NATIVE );
@@ -103,6 +117,11 @@ public:
protected: protected:
wxOutputStream &m_output; wxOutputStream &m_output;
wxEOL m_mode; wxEOL m_mode;
#if wxUSE_UNICODE
wxMBConv &m_conv;
#endif
}; };
#endif #endif

View File

@@ -38,10 +38,17 @@
// wxTextInputStream // wxTextInputStream
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
#if wxUSE_UNICODE
wxTextInputStream::wxTextInputStream(wxInputStream &s, const wxString &sep, wxMBConv& conv)
: m_input(s), m_separators(sep), m_conv(conv)
{
}
#else
wxTextInputStream::wxTextInputStream(wxInputStream &s, const wxString &sep) wxTextInputStream::wxTextInputStream(wxInputStream &s, const wxString &sep)
: m_input(s), m_separators(sep) : m_input(s), m_separators(sep)
{ {
} }
#endif
wxTextInputStream::~wxTextInputStream() wxTextInputStream::~wxTextInputStream()
{ {
@@ -234,12 +241,23 @@ wxString wxTextInputStream::ReadString()
wxString wxTextInputStream::ReadLine() wxString wxTextInputStream::ReadLine()
{ {
wxChar c;
wxString line; wxString line;
while ( !m_input.Eof() ) while ( !m_input.Eof() )
{ {
c = m_input.GetC(); #if wxUSE_UNICODE
// FIXME: this is only works for single byte encodings
// How-to read a single char in an unkown encoding???
char buf[10];
buf[0] = m_input.GetC();
buf[1] = 0;
wxChar wbuf[2];
m_conv.MB2WC( wbuf, buf, 2 );
wxChar c = wbuf[0];
#else
char c = m_input.GetC();
#endif
if ( !m_input ) if ( !m_input )
break; break;
@@ -343,8 +361,15 @@ wxTextInputStream& wxTextInputStream::operator>>(float& f)
return *this; return *this;
} }
#if wxUSE_UNICODE
wxTextOutputStream::wxTextOutputStream(wxOutputStream& s, wxEOL mode, wxMBConv& conv)
: m_output(s), m_conv(conv)
#else
wxTextOutputStream::wxTextOutputStream(wxOutputStream& s, wxEOL mode) wxTextOutputStream::wxTextOutputStream(wxOutputStream& s, wxEOL mode)
: m_output(s) : m_output(s)
#endif
{ {
m_mode = mode; m_mode = mode;
if (m_mode == wxEOL_NATIVE) if (m_mode == wxEOL_NATIVE)
@@ -445,8 +470,13 @@ void wxTextOutputStream::WriteString(const wxString& string)
out << c; out << c;
} }
// NB: we don't need to write the trailing NUL here // We must not write the trailing NULL here
m_output.Write(out.c_str(), out.length() * sizeof(wxChar)); #if wxUSE_UNICODE
wxCharBuffer buffer = m_conv.cWC2MB( out );
m_output.Write( (const char*) buffer, strlen( (const char*) buffer ) );
#else
m_output.Write(out.c_str(), out.length() );
#endif
} }
wxTextOutputStream& wxTextOutputStream::operator<<(const wxChar *string) wxTextOutputStream& wxTextOutputStream::operator<<(const wxChar *string)