Re: Question about IXmlWriter WriteRaw(string) and UTF-8
Frank S <OldGrouch@community.nospam> wrote:
Thanks for the reply! I tried that approach, as shown in this code
fragment:
//hr = pWriter->WriteRaw(sXMLData.c_str()); // original approach -
data already UTF-8 encoded. //assert(SUCCEEDED(hr));
hr = pWriter->Flush();
assert(SUCCEEDED(hr));
ULONG nWritten;
hr = pMemoryStream->Write(sXMLData.c_str(), sXMLData.size(),
&nWritten); assert(SUCCEEDED(hr));
hr = pWriter->WriteFullEndElement();//data
assert(SUCCEEDED(hr));
These calls succeed, but later when I get the contents of the stream,
I see only the data written before the IXMLWriter::Flush call.
What type is sXMLData? If WriteRaw(sXMLData.c_str()) actually compiled,
sXMLData is probably a wstring. wstring holds Unicode characters
(usually in UTF-16 encoding). What exactly do you mean when you say it's
UTF-8 encoded? How do you obtain this string?
I suspect sXMLData _is_ in fact a UTF-16 encoded Unicode string, which
usually means every other byte in it is zero. So you write those zeros
directly into the raw stream. Then you read those zeros back into some
string. Then you look at it in debugger, which assumes the string is
terminated by the first zero byte. And that's why you don't see anything
beyond what's written before Flush.
Also, note that IStream::Write takes a number of bytes as a second
parameter, while sXMLData.size() returns a number of characters. The two
are the same if sXMLData is std::string, of course, but not if it's
wstring.
--
With best wishes,
Igor Tandetnik
With sufficient thrust, pigs fly just fine. However, this is not
necessarily a good idea. It is hard to be sure where they are going to
land, and it could be dangerous sitting under them as they fly
overhead. -- RFC 1925