void CFX_XMLElement::Save( const RetainPtr<IFX_SeekableWriteStream>& pXMLStream) { ByteString bsNameEncoded = name_.ToUTF8(); pXMLStream->WriteString("<"); pXMLStream->WriteString(bsNameEncoded.AsStringView()); for (auto it : attrs_) { // Note, the space between attributes is added by AttributeToString which // writes a blank as the first character. pXMLStream->WriteString( AttributeToString(it.first, it.second).ToUTF8().AsStringView()); } if (!GetFirstChild()) { pXMLStream->WriteString(" />\n"); return; } pXMLStream->WriteString(">\n"); for (CFX_XMLNode* pChild = GetFirstChild(); pChild; pChild = pChild->GetNextSibling()) { pChild->Save(pXMLStream); } pXMLStream->WriteString("</"); pXMLStream->WriteString(bsNameEncoded.AsStringView()); pXMLStream->WriteString(">\n"); }
TEST(fxstring, FX_UTF8EncodeDecodeConsistency) { WideString wstr; wstr.Reserve(0x10000); for (int w = 0; w < 0x10000; ++w) wstr += static_cast<wchar_t>(w); ByteString bstr = FX_UTF8Encode(wstr.AsStringView()); WideString wstr2 = FX_UTF8Decode(bstr.AsStringView()); EXPECT_EQ(0x10000u, wstr2.GetLength()); EXPECT_EQ(wstr, wstr2); }