Re: Multi-Byte Application with XP Theme
"David Ching" <dc@remove-this.dcsoft.com> ha scritto nel messaggio
news:vfhAj.6026$pl4.778@newssvr22.news.prodigy.net...
I've done that when using the Tiny XML parser which is Ansi only, yet the
rest of my app is Unicode. It's a pain to convert your strings to Ansi to
call the methods of the TinyXML parser class and convert back to Unicode
to get results, but the CStringA and CStringW makes it at least simple to
do this, if not laborious.
Hi David,
I've not done proper tests, but I think that these open-source
cross-platform libraries like TinyXML uses char* because they assume that
char * is fine for both ASCII and Unicode UTF-8. I've seen some
cross-platform (Linux and Windows) open-source libraries, and IIRC all of
them use always char* for strings, they use always strlen, etc. because they
work for both ASCII and UTF-8 [*], without the need of having a new type
like wchar_t or doing the TCHAR thing and double functions implementation
like DoSomethingA/W typical of Windows.
In fact, I read about TinyXML and UTF-8 also here:
http://www.grinninglizard.com/tinyxmldocs/index.html
So, when using TinyXML in Unicode Windows apps (which means Unicode UTF-16),
I think that the proper conversions should be:
- from TinyXML (char *) to Windows (wchar_t *) : use ::MultiByteToWideChar
with CP_UTF8 "code page" value;
- from Windows (wchar_t *) to TinyXML (char*) : use ::WideCharToMultiByte
with CP_UTF8 again
[*] One could say: << But strlen will return the number of char's, not the
number of Unicode "logical characters" or "code points" >>, but I think this
is not a valid reason to discard UTF-8 and strlen. In fact, the same problem
is for UTF-16, because wcslen will return the number of wchar_t's, and not
the number of code points, because wcslen does not know about surrogate
pairs.
Giovanni