diff --git a/src/util/unicode.cpp b/src/util/unicode.cpp index 59aea736547..cb22f3a5d65 100644 --- a/src/util/unicode.cpp +++ b/src/util/unicode.cpp @@ -7,6 +7,8 @@ Author: Daniel Kroening, kroening@kroening.com \*******************************************************************/ #include +#include +#include #include "unicode.h" @@ -253,3 +255,34 @@ const char **narrow_argv(int argc, const wchar_t **argv_wide) return argv_narrow; } + +std::wstring utf8_to_utf16be(const std::string& in) +{ + std::wstring_convert > converter; + return converter.from_bytes(in); +} + +std::wstring utf8_to_utf16le(const std::string& in) +{ + std::wstring_convert > converter; + return converter.from_bytes(in); +} + +std::string utf16le_to_ascii(const std::wstring& in) +{ + std::string result; + std::locale loc; + for(const auto c : in) + { + if(c <= 255 && isprint(c,loc)) + result+=(unsigned char)c; + else + { + result+="\\u"; + char hex[5]; + sprintf(hex,"%04x",(wchar_t)c); + result+=hex; + } + } + return result; +} diff --git a/src/util/unicode.h b/src/util/unicode.h index 44038a26c04..e22bb10574c 100644 --- a/src/util/unicode.h +++ b/src/util/unicode.h @@ -21,6 +21,10 @@ std::wstring widen(const std::string &s); std::string utf32_to_utf8(const std::basic_string &s); std::string utf16_to_utf8(const std::basic_string &s); +std::string utf16le_to_ascii(const std::wstring&); + +std::wstring utf8_to_utf16be(const std::string&); +std::wstring utf8_to_utf16le(const std::string&); const char **narrow_argv(int argc, const wchar_t **argv_wide);