No response to this so far.  Am I better off rebuilding Xerces-C with
XMLCh typedef'd to char16_t?

Regards,
Tom

On Mon, Sep 15, 2014 at 4:16 PM, Tom Cook <tom.k.c...@gmail.com> wrote:
> Hi,
>
> I've googled around and found this question asked in quite a few
> places, but not any answer to it.
>
> What is the best way of handling strings, and particularly string
> literals, in portable code?
>
> Specifically, I'm interested in building code with VC++ 2013 on
> Windows and G++ 4.8 on Linux.  On Windows, the Xerces binary build
> uses wchar_t as the character type, and so, naturally enough, people
> on Windows write code that passes around wchar_t.  Unfortunately, G++
> has a 4-byte wchar_t and so Xerces uses unsigned short int (or
> uint16_t) as its character type.  This causes all such code written
> for Windows to break in fairly horrible ways on Linux, and in ways
> that require wide-ranging code changes to fix.
>
> So far, the best solution I've come up with looks something like this:
>
> #if defined _MSC_VER
> #define U16S(x) L##x
> typedef wchar_t my_u16_char_t;
> typedef std::wstring my_u16_str_t;
> typedef std::wstringstream my_u16_stream_t;
> inline XmlCh* XmlString(my_u16_char_t* s) { return s; }
> inline XmlCh* XmlString(my_u16_str_t* s) { return s.c_str(); }
> #elif defined __linux
> #define U16S(x) u##x
> typedef char16_t my_u16_char_t;
> typedef std::basic_string<char16_t> my_u16_str_t;
> typedef std::basic_stringstream<char16_t> my_u16_stream_t;
> inline XmlCh* XmlString(my_u16_char_t* s) { return
> reinterpret_cast<char16_t*>(s); }
> inline XmlCh* XmlString(my_u16_str_t* s) { return XmlString(s.c_str()); }
> #endif
>
> But of course this still requires major code changes for existing code
> that uses wchar_t.
>
> Is there a better way of sorting this out?  C++11 now has a distinct,
> UTF-16-encoded character type, char16_t.  Is there any plan to make
> Xerces use it?
>
> Thanks,
> Tom

Reply via email to