Mercurial > octave
changeset 25531:c2dc2fb6359b
Fix C++ conversion functions between UTF-8 and wchar_t.
* lo-sysdep.cc (u8_to_wstring, u8_from_wstring): Don't truncate strings
containing 0 character on conversion.
author | Markus Mützel <markus.muetzel@gmx.de> |
---|---|
date | Sat, 30 Jun 2018 18:51:38 +0200 |
parents | 197126863d95 |
children | 7dad5fa7e88e |
files | liboctave/system/lo-sysdep.cc |
diffstat | 1 files changed, 15 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/liboctave/system/lo-sysdep.cc Sat Jun 30 16:42:19 2018 +0200 +++ b/liboctave/system/lo-sysdep.cc Sat Jun 30 18:51:38 2018 +0200 @@ -154,14 +154,19 @@ std::wstring u8_to_wstring (const std::string& utf8_string) { - wchar_t *wchar = nullptr; + size_t srclen = utf8_string.length (); + const uint8_t *src = reinterpret_cast<const uint8_t *> + (utf8_string.c_str ()); - wchar = u8_to_wchar (utf8_string.c_str ()); + size_t length = 0; + wchar_t *wchar = reinterpret_cast<wchar_t *> + (octave_u8_conv_to_encoding ("wchar_t", src, srclen, + &length)); std::wstring retval = L""; if (wchar != nullptr) { - retval = std::wstring (wchar); + retval = std::wstring (wchar, length / sizeof (wchar_t)); free (static_cast<void *> (wchar)); } @@ -171,14 +176,18 @@ std::string u8_from_wstring (const std::wstring& wchar_string) { - char *mbchar = nullptr; + size_t srclen = wchar_string.length () * sizeof (wchar_t); + const char *src = reinterpret_cast<const char *> (wchar_string.c_str ()); - mbchar = u8_from_wchar (wchar_string.c_str ()); + size_t length = 0; + char *mbchar = reinterpret_cast<char *> + (octave_u8_conv_from_encoding ("wchar_t", src, srclen, + &length)); std::string retval = ""; if (mbchar != nullptr) { - retval = std::string (mbchar); + retval = std::string (mbchar, length); free (static_cast<void *> (mbchar)); }