| 100 | |
| 101 | template<typename T> |
| 102 | static T convertUtf32ToUtf16(const std::u32string& utf32_str) { |
| 103 | T result; |
| 104 | result.reserve(utf32_str.size()); |
| 105 | |
| 106 | for (char32_t character : utf32_str) { |
| 107 | if (character <= 0xFFFF) { |
| 108 | if (character >= 0xD800 && character <= 0xDFFF) // Error |
| 109 | return result; |
| 110 | result.push_back(static_cast<char16_t>(character)); |
| 111 | } |
| 112 | else if (character <= 0x10FFFF) { |
| 113 | character -= 0x10000; |
| 114 | auto high_surrogate = static_cast<char16_t>((character >> 10) + 0xD800); |
| 115 | auto low_surrogate = static_cast<char16_t>((character & 0x3FF) + 0xDC00); |
| 116 | result.push_back(high_surrogate); |
| 117 | result.push_back(low_surrogate); |
| 118 | } |
| 119 | else // Error |
| 120 | return result; |
| 121 | } |
| 122 | return result; |
| 123 | } |
| 124 | |
| 125 | template<typename T> |
| 126 | static std::u32string convertUtf16ToUtf32(const T& utf16_str) { |