Fix bug 77975

This commit is contained in:
Daria Ermakova
2026-04-03 14:56:34 +03:00
parent 9b196ada1f
commit 55fe2e968f

View File

@ -877,72 +877,92 @@ namespace XmlUtils
}
return buffer;
}
std::wstring EncodeXmlString(const std::wstring& data, bool bDeleteNoUnicode)
{
std::wstring buffer;
buffer.reserve(data.size());
}
std::wstring EncodeXmlString(const std::wstring& data, bool bDeleteNoUnicode)
{
std::wstring buffer;
buffer.reserve(data.size());
if(bDeleteNoUnicode)
{
for(size_t pos = 0; pos < data.size(); ++pos)
{
switch(data[pos])
{
case '&': buffer.append(L"&amp;"); break;
case '\"': buffer.append(L"&quot;"); break;
case '\'': buffer.append(L"&apos;"); break;
case '<': buffer.append(L"&lt;"); break;
case '>': buffer.append(L"&gt;"); break;
default:
{
if ( false == IsUnicodeSymbol( data[pos] ) )
{
wchar_t symbol1 = data[pos];
if(0xD800 <= symbol1 && symbol1 <= 0xDFFF && pos + 1 < data.size())
{
pos++;
wchar_t symbol2 = data[pos];
if (symbol1 < 0xDC00 && symbol2 >= 0xDC00 && symbol2 <= 0xDFFF)
{
buffer.append(&data[pos-1], 2);
}
else
{
buffer.append(L" ");
}
}
else
{
buffer.append(L" ");
}
}
else
buffer.append(&data[pos], 1);
}break;
}
}
}
else
{
for(size_t pos = 0; pos < data.size(); ++pos)
{
switch(data[pos])
{
case '&': buffer.append(L"&amp;"); break;
case '\"': buffer.append(L"&quot;"); break;
case '\'': buffer.append(L"&apos;"); break;
case '<': buffer.append(L"&lt;"); break;
case '>': buffer.append(L"&gt;"); break;
case '\0':
return buffer;
default: buffer.append(&data[pos], 1); break;
}
}
}
if(bDeleteNoUnicode)
{
for (size_t pos = 0; pos < data.size(); ++pos)
{
switch (data[pos])
{
case L'&': buffer.append(L"&amp;"); continue;
case L'\"': buffer.append(L"&quot;"); continue;
case L'\'': buffer.append(L"&apos;"); continue;
case L'<': buffer.append(L"&lt;"); continue;
case L'>': buffer.append(L"&gt;"); continue;
case L'\0':
default:
{
if (!IsUnicodeSymbol(static_cast<unsigned int>( data[pos])))
{
#ifdef _WIN32
wchar_t symbol1 = data[pos];
#else
uint16_t symbol1 = static_cast<uint16_t>(data[pos]);
#endif
if(0xD800 <= symbol1 && symbol1 <= 0xDFFF && pos + 1 < data.size())
{
#ifdef _WIN32
wchar_t symbol2 = data[pos+1];
#else
uint16_t symbol2 = static_cast<uint16_t>(data[pos+1]);
#endif
if (symbol1 < 0xDC00 && symbol2 >= 0xDC00 && symbol2 <= 0xDFFF)
{
#ifdef _WIN32
buffer.append(&data[pos], 2);
#else
uint32_t codepoint = 0x10000 + ((symbol1 - 0xD800) << 10) + (symbol2 - 0xDC00);
buffer += static_cast<wchar_t>(codepoint);
#endif
pos++;
}
else
{
buffer.append(L" ");
}
}
else
{
buffer.append(L" ");
}
}
else
{
buffer.append(&data[pos], 1);
}
}break;
}
}
}
else
{
for(size_t pos = 0; pos < data.size(); ++pos)
{
switch(data[pos])
{
case '&': buffer.append(L"&amp;"); break;
case '\"': buffer.append(L"&quot;"); break;
case '\'': buffer.append(L"&apos;"); break;
case '<': buffer.append(L"&lt;"); break;
case '>': buffer.append(L"&gt;"); break;
case '\0':
return buffer;
default:
buffer.append(&data[pos], 1); break;
}
}
}
return buffer;
}
return buffer;
}
std::wstring DeleteNonUnicode(const std::wstring& data)
{
std::wstring buffer;