mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-07-11 07:23:34 +08:00
Fix bug 77975
This commit is contained in:
@ -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"&"); break;
|
||||
case '\"': buffer.append(L"""); break;
|
||||
case '\'': buffer.append(L"'"); break;
|
||||
case '<': buffer.append(L"<"); break;
|
||||
case '>': buffer.append(L">"); 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"&"); break;
|
||||
case '\"': buffer.append(L"""); break;
|
||||
case '\'': buffer.append(L"'"); break;
|
||||
case '<': buffer.append(L"<"); break;
|
||||
case '>': buffer.append(L">"); 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"&"); continue;
|
||||
case L'\"': buffer.append(L"""); continue;
|
||||
case L'\'': buffer.append(L"'"); continue;
|
||||
case L'<': buffer.append(L"<"); continue;
|
||||
case L'>': buffer.append(L">"); 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"&"); break;
|
||||
case '\"': buffer.append(L"""); break;
|
||||
case '\'': buffer.append(L"'"); break;
|
||||
case '<': buffer.append(L"<"); break;
|
||||
case '>': buffer.append(L">"); 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;
|
||||
|
||||
Reference in New Issue
Block a user