#pragma once #include #include #include std::vector splitIntoLines(const std::string& s); std::vector wrapSingleLineString( const std::string& s, int lineLength, int hangingIndent = 0 ); std::vector wrapString(const std::string& s, int lineLength, int hangingIndent = 0); bool isValidUtf8(const std::string& s); std::wstring latin1ToWide(const std::string& s); std::string utf8ToAscii(const std::string& s); enum class NormalizationOptions : int { CompatibilityMode = UTF8PROC_COMPAT, Compose = UTF8PROC_COMPOSE, Decompose = UTF8PROC_DECOMPOSE, StripIgnorableCharacters = UTF8PROC_IGNORE, ThrowOnUnassignedCodepoints = UTF8PROC_REJECTNA, SimplifyLineBreaks = UTF8PROC_NLF2LS, SimplifyWhiteSpace = UTF8PROC_STRIPCC, StripCharacterMarkings = UTF8PROC_STRIPMARK }; constexpr NormalizationOptions operator|(NormalizationOptions a, NormalizationOptions b) { return static_cast(static_cast(a) | static_cast(b)); } std::string normalizeUnicode(const std::string& s, NormalizationOptions options); template std::string join(T range, const std::string separator) { std::string result; bool isFirst = true; for (const auto& element : range) { if (!isFirst) result.append(separator); isFirst = false; result.append(boost::lexical_cast(element)); } return result; } std::string escapeJsonString(const std::string& s);