UTF8: Utilize the safe conversion from wchar
Invalid wchar characters would throw an exception. We need a defined
output from the += operator, even for unknown character.
Fixes: lp:1798144
* https://bugs.launchpad.net/kicad/+bug/1798144
(cherry picked from commit b37bc69476
)
This commit is contained in:
parent
08e1379671
commit
594c1bded1
|
@ -24,6 +24,8 @@
|
||||||
|
|
||||||
#include <utf8.h>
|
#include <utf8.h>
|
||||||
#include <ki_exception.h>
|
#include <ki_exception.h>
|
||||||
|
#include <wx/strconv.h>
|
||||||
|
#include <wx/buffer.h>
|
||||||
|
|
||||||
/* THROW_IO_ERROR needs this, but it includes this file, so until some
|
/* THROW_IO_ERROR needs this, but it includes this file, so until some
|
||||||
factoring of THROW_IO_ERROR into a separate header, defer and use the asserts.
|
factoring of THROW_IO_ERROR into a separate header, defer and use the asserts.
|
||||||
|
@ -197,24 +199,11 @@ bool IsUTF8( const char* aString )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
UTF8::UTF8( const wchar_t* txt ) :
|
UTF8::UTF8( const wchar_t* txt )
|
||||||
// size initial string safely large enough, then shrink to known size later.
|
|
||||||
m_s( wcslen( txt ) * 4, 0 )
|
|
||||||
{
|
{
|
||||||
/*
|
wxCharBuffer charbuf = wxSafeConvertWX2MB( txt );
|
||||||
|
|
||||||
"this" string was sized to hold the worst case UTF8 encoded byte
|
m_s.assign( charbuf.data() );
|
||||||
sequence, and was initialized with all nul bytes. Overwrite some of
|
|
||||||
those nuls, then resize, shrinking down to actual size.
|
|
||||||
|
|
||||||
Use the wx 2.8 function, not new FromWChar(). It knows about wchar_t
|
|
||||||
possibly being 16 bits wide on Windows and holding UTF16 input.
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
int sz = wxConvUTF8.WC2MB( (char*) m_s.data(), txt, m_s.size() );
|
|
||||||
|
|
||||||
m_s.resize( sz );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -224,6 +213,7 @@ UTF8& UTF8::operator+=( unsigned w_ch )
|
||||||
m_s.operator+=( char( w_ch ) );
|
m_s.operator+=( char( w_ch ) );
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
//TODO: Remove wchar use. Replace with std::byte*
|
||||||
wchar_t wide_chr[2]; // buffer to store wide chars (UTF16) read from aText
|
wchar_t wide_chr[2]; // buffer to store wide chars (UTF16) read from aText
|
||||||
wide_chr[1] = 0;
|
wide_chr[1] = 0;
|
||||||
wide_chr[0] = w_ch;
|
wide_chr[0] = w_ch;
|
||||||
|
|
Loading…
Reference in New Issue