diff --git a/OOXML/Base/Unit.cpp b/OOXML/Base/Unit.cpp index bbd808e890..ee2ebd23b7 100644 --- a/OOXML/Base/Unit.cpp +++ b/OOXML/Base/Unit.cpp @@ -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( data[pos]))) + { +#ifdef _WIN32 + wchar_t symbol1 = data[pos]; +#else + uint16_t symbol1 = static_cast(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(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(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;