Hi, Scott, On Fri, Nov 27, 2015 at 1:01 AM, Scott Robison <scott at casaderobison.com> wrote: > On Thu, Nov 26, 2015 at 10:13 PM, Igor Korot <ikorot01 at gmail.com> wrote: >> >> Hi, >> Is there any way to have "sqlite3_errmsg" function return a wide char > string? >> Or do a conversion in a portable way? >> >> Thank you. > > The portable way would be to use the mbstowcs function from stdlib.h, > though it depends on what locales are supported by the system, so maybe not > as portable as you would like.
I should've been more explicit here, sorry. I'm developing in C++ and need to convert to std::wstring. Or maybe I can just generate my own error message based on the sqlite return code? Thank you. > > There isn't really a truly portable way of converting from char to wchar_t > based strings, given that there is no real guarantee about what exactly > wchar_t *is*. The ISO C90 standard merely defined it as "an integral type > whose range of values can represent distinct codes for all members of the > largest extended character set specified among the supported locales". In > theory, wchar_t could be a typedef of char if a platform only supported an > 8 bit character set. Unicode was being designed at the time of C > standardization, but the first version of Unicode wasn't published for a > year or more after the C90 standard. Thus the wchar_t type doesn't have to > be Unicode, > > In practical terms, I generally consider wchar_t to be a pre-2011 method of > storing Unicode. Even here there are no portability guarantees. Microsoft > went all in on Unicode in the early 1990s, back when it was only a two byte > encoding (UCS-2), so Microsoft compilers treat wchar_t as a two byte type. > Unicode 2.0 extended the Unicode character set in 1996 (I think) and > introduced UTF-16 as a compromise way of allowing systems that embraced > Unicode 1.0 (when it "guaranteed" a 16 bit character space) to support the > full space of Unicode code points from U+0000 to U+10FFFF via surrogate > pairs. Modern posix systems (as far as I know) define wchar_t to be a 32 > bit type, so you can't really convert to wchar_t in a portable way, because > you have to handle surrogate pairs on Windows vs simple code points in > posix (though this should be handled by mbstowcs if the platform supports > wchar_t as unicode). > > If you only use ASCII or Latin-1 8 bit characters in your code, or are > willing to treat all char objects as ASCII or Latin-1, then you can convert > char strings to wchar_t strings by simply zero extending each character > while copying it. Something like this (without any error checking): > > void copy_narrow_to_wide(wchar_t* dst, const char* src) > { > while (*src) *(dst++) = (unsigned char)(*(src++)); > *dst = 0; > } > > -- > Scott Robison > _______________________________________________ > sqlite-users mailing list > sqlite-users at mailinglists.sqlite.org > http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users