On Fri, Nov 27, 2015 at 12:17 AM, Scott Robison <scott at casaderobison.com> wrote: > On Thu, Nov 26, 2015 at 11:42 PM, Igor Korot <ikorot01 at gmail.com> wrote: > >> 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? >> > > Most of the comments I made previously still apply, since wstring is just a > basic_string using wchar_t as the character type. C++ doesn't mandate the > character set that wchar_t encompasses or the encoding it uses for that > character set any more than C does. I like the C++11 char16_t & char32_t > types (when available) since they are explicitly designed for unicode. > > Some useful answers can be found at > http://stackoverflow.com/questions/2573834/c-convert-string-or-char-to-wstring-or-wchar-t
or ... http://stackoverflow.com/questions/7153935/how-to-convert-utf-8-stdstring-to-utf-16-stdwstring don't see what converting utf8 to utf16 has to do with locale ... or why in the last decade a useful standard function hasn't been included in standard libraries... > ... > > A C++-ish way of converting a string to a wstring (assuming the characters > in string are all ASCII or Latin-1 and wchar_t is unicode): > > // horribly inefficient but illustrative > void copy_narrow_to_wide(std::wstring& dst, const char* src) > { > while (*src) dst.push_back((unsigned char)(*(src++))); > } > > Not that I'd necessarily recommend that, but it can work. The link above in > particular is useful if all you need are to convert narrow strings to wide > strings for internal usage (logging or such). > > However, I think you hit the nail on the head with your last thought > (especially if you need to display these in potentially localized text): > generate your own error messages 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 >> _______________________________________________ >> sqlite-users mailing list >> sqlite-users at mailinglists.sqlite.org >> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users >> > > > > -- > Scott Robison > _______________________________________________ > sqlite-users mailing list > sqlite-users at mailinglists.sqlite.org > http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users