diff --git a/include/stdex/parser.hpp b/include/stdex/parser.hpp index f8e03ff17..028cc8910 100644 --- a/include/stdex/parser.hpp +++ b/include/stdex/parser.hpp @@ -127,7 +127,8 @@ namespace stdex _In_ int flags = match_default) = 0; /// \cond internal - const wchar_t* next_sgml_cp(_In_ const char* text, _In_ size_t start, _In_ size_t end, _Out_ size_t& chr_end, _Out_ wchar_t(&buf)[3]) + template + const T* next_sgml_cp(_In_ const char* text, _In_ size_t start, _In_ size_t end, _Out_ size_t& chr_end, _Out_ T(&buf)[5]) { if (text[start] == '&') { // Potential entity start @@ -139,31 +140,9 @@ namespace stdex } if (text[chr_end] == ';') { // Entity end + utf32_t buf32[2]; size_t n = chr_end - start - 1; - if (n >= 2 && text[start + 1] == '#') { - // Numerical entity - utf32_t unicode; - if (text[start + 2] == 'x' || text[start + 2] == 'X') - unicode = static_cast(strtou32(text + start + 3, n - 2, nullptr, 16)); - else - unicode = static_cast(strtou32(text + start + 2, n - 1, nullptr, 10)); -#ifdef _WIN32 - if (unicode < 0x10000) { - buf[0] = (wchar_t)unicode; - buf[1] = 0; - } - else { - ucs4_to_surrogate_pair(buf, unicode); - buf[2] = 0; - } -#else - buf[0] = (wchar_t)unicode; - buf[1] = 0; -#endif - chr_end++; - return buf; - } - const wchar_t* entity_w = sgml2uni(text + start + 1, n); + auto entity_w = utf32_to_wstr(sgml2uni(text + start + 1, n, buf32), buf); if (entity_w) { chr_end++; return entity_w; @@ -361,7 +340,7 @@ namespace stdex m_invert(invert) { _Assume_(chr || !count); - wchar_t buf[3]; + wchar_t buf[5]; size_t chr_end; m_chr.assign(count ? next_sgml_cp(chr, 0, count, chr_end, buf) : L""); } @@ -375,7 +354,7 @@ namespace stdex { _Assume_(text || start >= end); if (start < end && text[start]) { - wchar_t buf[3]; + wchar_t buf[5]; const wchar_t* chr = next_sgml_cp(text, start, end, this->interval.end, buf); bool r = ((flags & match_case_insensitive) ? stdex::strnicmp(chr, stdex::strlen(chr), m_chr.data(), m_chr.size(), m_locale) : @@ -456,7 +435,7 @@ namespace stdex { _Assume_(text || start >= end); if (start < end && text[start]) { - wchar_t buf[3]; + wchar_t buf[5]; const wchar_t* chr = next_sgml_cp(text, start, end, this->interval.end, buf); const wchar_t* chr_end = chr + stdex::strlen(chr); bool r = @@ -534,7 +513,7 @@ namespace stdex { _Assume_(text || start >= end); if (start < end && text[start]) { - wchar_t buf[3]; + wchar_t buf[5]; const wchar_t* chr = next_sgml_cp(text, start, end, this->interval.end, buf); const wchar_t* chr_end = chr + stdex::strlen(chr); bool r = std::use_facet>(m_locale).scan_not(std::ctype_base::punct, chr, chr_end) == chr_end; @@ -611,7 +590,7 @@ namespace stdex { _Assume_(text || start >= end); if (start < end && text[start]) { - wchar_t buf[3]; + wchar_t buf[5]; const wchar_t* chr = next_sgml_cp(text, start, end, this->interval.end, buf); const wchar_t* chr_end = chr + stdex::strlen(chr); bool r = @@ -807,7 +786,7 @@ namespace stdex { _Assume_(text || start >= end); if (start < end && text[start]) { - wchar_t buf[3]; + wchar_t buf[5]; const wchar_t* chr = next_sgml_cp(text, start, end, this->interval.end, buf); const wchar_t* set = m_set.data(); size_t r = (flags & match_case_insensitive) ? @@ -906,7 +885,7 @@ namespace stdex this->interval.invalidate(); return false; } - wchar_t buf[3]; + wchar_t buf[5]; const wchar_t* chr = next_sgml_cp(text, this->interval.end, end, this->interval.end, buf); for (; *chr; ++str, ++chr) { if (!*str || @@ -2551,7 +2530,7 @@ namespace stdex { _Assume_(text || start >= end); if (start < end && text[start]) { - wchar_t buf[3]; + wchar_t buf[5]; const wchar_t* chr = next_sgml_cp(text, start, end, this->interval.end, buf); const wchar_t* chr_end = chr + stdex::strlen(chr); if (((chr[0] == L'-' || @@ -2865,7 +2844,7 @@ namespace stdex { _Assume_(text || start >= end); if (start < end && text[start]) { - wchar_t buf[3]; + wchar_t buf[5]; const wchar_t* chr = next_sgml_cp(text, start, end, this->interval.end, buf); const wchar_t* chr_end = chr + stdex::strlen(chr); if ((('A' <= chr[0] && chr[0] <= 'Z') || @@ -3041,7 +3020,7 @@ namespace stdex { _Assume_(text || start >= end); if (start < end && text[start]) { - wchar_t buf[3]; + wchar_t buf[5]; const wchar_t* chr = next_sgml_cp(text, start, end, this->interval.end, buf); const wchar_t* chr_end = chr + stdex::strlen(chr); if (((chr[0] == L'-' || @@ -3143,7 +3122,7 @@ namespace stdex { _Assume_(text || start >= end); if (start < end && text[start]) { - wchar_t buf[3]; + wchar_t buf[5]; const wchar_t* chr = next_sgml_cp(text, start, end, this->interval.end, buf); const wchar_t* chr_end = chr + stdex::strlen(chr); if (((chr[0] == L'-' || @@ -3249,7 +3228,7 @@ namespace stdex { _Assume_(text || start >= end); if (start < end && text[start]) { - wchar_t buf[3]; + wchar_t buf[5]; const wchar_t* chr = next_sgml_cp(text, start, end, this->interval.end, buf); const wchar_t* chr_end = chr + stdex::strlen(chr); if (((chr[0] == L'/' || diff --git a/include/stdex/sgml.hpp b/include/stdex/sgml.hpp index 9388917b6..f01976ef6 100644 --- a/include/stdex/sgml.hpp +++ b/include/stdex/sgml.hpp @@ -23,30 +23,61 @@ namespace stdex { /// \cond internal template - const wchar_t* sgml2uni(_In_reads_or_z_(count) const T* entity, _In_ size_t count) + const utf32_t* sgml2uni(_In_reads_or_z_(count) const T* entity, _In_ size_t count, utf32_t buf[2]) { _Assume_(entity && count); - _Assume_(count < 2 || entity[0] != '#'); // No numeric entities - for (size_t i = 0, j = _countof(sgml_unicode); i < j; ) { - size_t m = (i + j) / 2; - if (sgml_unicode[m].sgml[0] < entity[0]) - i = m + 1; - else if (sgml_unicode[m].sgml[0] > entity[0]) - j = m; - else { - auto r = strncmp(sgml_unicode[m].sgml + 1, _countof(sgml_unicode[0].sgml) - 1, entity + 1, count - 1); - if (r < 0) + if (count < 2 || entity[0] != '#') { + for (size_t i = 0, j = _countof(sgml_unicode); i < j; ) { + size_t m = (i + j) / 2; + if (sgml_unicode[m].sgml[0] < entity[0]) i = m + 1; - else if (r > 0) + else if (sgml_unicode[m].sgml[0] > entity[0]) j = m; else { - for (; i < m && strncmp(sgml_unicode[m - 1].sgml, _countof(sgml_unicode[0].sgml), entity, count) == 0; m--); - return sgml_unicode[m].unicode; + auto r = strncmp(sgml_unicode[m].sgml + 1, _countof(sgml_unicode[0].sgml) - 1, entity + 1, count - 1); + if (r < 0) + i = m + 1; + else if (r > 0) + j = m; + else { + for (; i < m && strncmp(sgml_unicode[m - 1].sgml, _countof(sgml_unicode[0].sgml), entity, count) == 0; m--); + return sgml_unicode[m].unicode; + } } } + return nullptr; } - return nullptr; + + buf[0] = entity[1] == 'x' || entity[1] == 'X' ? + static_cast(strtou32(&entity[2], count - 2, nullptr, 16)) : + static_cast(strtou32(&entity[1], count - 1, nullptr, 10)); + buf[1] = 0; + return buf; + } + + inline const utf16_t* utf32_to_wstr(_In_opt_z_ const utf32_t* str, utf16_t* buf) + { + if (!str) + return nullptr; + for (size_t i = 0, j = 0;; ++i) { + if (!str[i]) { + buf[j] = 0; + return buf; + } + if (str[i] < 0x10000) + buf[j++] = static_cast(str[i]); + else { + ucs4_to_surrogate_pair(&buf[j], str[i]); + j += 2; + } + } + } + + inline const utf32_t* utf32_to_wstr(_In_opt_z_ const utf32_t* str, utf32_t* buf) + { + _Unreferenced_(buf); + return str; } template @@ -104,35 +135,11 @@ namespace stdex for (size_t i = 0; i < count_src && src[i];) { if (src[i] == '&') { - auto end = sgmlend(src + i + 1, count_src - i - 1); + auto end = sgmlend(&src[i + 1], count_src - i - 1); if (end) { - const wchar_t* entity_w; - wchar_t chr[3]; + utf32_t chr[2]; size_t n = end - src - i - 1; - if (n >= 2 && src[i + 1] == '#') { - utf32_t unicode; - if (src[i + 2] == 'x' || src[i + 2] == 'X') - unicode = strtou32(src + i + 3, n - 2, nullptr, 16); - else - unicode = strtou32(src + i + 2, n - 1, nullptr, 10); -#ifdef _WIN32 - if (unicode < 0x10000) { - chr[0] = (wchar_t)unicode; - chr[1] = 0; - } - else { - ucs4_to_surrogate_pair(chr, unicode); - chr[2] = 0; - } -#else - chr[0] = (wchar_t)unicode; - chr[1] = 0; -#endif - entity_w = chr; - } - else - entity_w = sgml2uni(src + i + 1, n); - + auto entity_w = sgml2uni(&src[i + 1], n, chr); if (entity_w) { i = end - src + 1; continue; @@ -157,7 +164,7 @@ namespace stdex } /// - /// Convert SGML string to Unicode (UTF-16 on Windows) and append to string + /// Convert SGML string to Unicode and append to string /// /// \param[in,out] dst String to append Unicode to /// \param[in] src SGML string @@ -166,9 +173,9 @@ namespace stdex /// \param[in] offset Logical starting offset of source and destination strings. Unused when map parameter is nullptr. /// \param[in,out] map The vector to append index mapping between source and destination string to. /// - template , class AX_to = std::allocator> + template , class AX_to = std::allocator> void sgml2strcat( - _Inout_ std::basic_string& dst, + _Inout_ std::basic_string& dst, _In_reads_or_z_opt_(count_src) const T_from* src, _In_ size_t count_src, _In_ int skip = 0, _In_ const mapping& offset = mapping(0, 0), @@ -194,49 +201,26 @@ namespace stdex dst.reserve(dst.size() + count_src); for (size_t i = 0; i < count_src;) { if (src[i] == '&') { - auto end = sgmlend(src + i + 1, count_src - i - 1); + auto end = sgmlend(&src[i + 1], count_src - i - 1); if (end) { - const wchar_t* entity_w; - wchar_t chr[3]; - _Assume_(src + i + 1 <= end); + utf32_t chr32[2]; + _Assume_(&src[i + 1] <= end); size_t n = static_cast(end - src) - i - 1; - if (n >= 2 && src[i + 1] == '#') { - utf32_t unicode; - if (src[i + 2] == 'x' || src[i + 2] == 'X') - unicode = static_cast(strtou32(src + i + 3, n - 2, nullptr, 16)); - else - unicode = static_cast(strtou32(src + i + 2, n - 1, nullptr, 10)); -#ifdef _WIN32 - if (unicode < 0x10000) { - chr[0] = (wchar_t)unicode; - chr[1] = 0; - } - else { - ucs4_to_surrogate_pair(chr, unicode); - chr[2] = 0; - } -#else - chr[0] = (wchar_t)unicode; - chr[1] = 0; -#endif - entity_w = chr; - } - else - entity_w = sgml2uni(src + i + 1, n); - + T_to chr[5]; + auto entity_w = utf32_to_wstr(sgml2uni(&src[i + 1], n, chr32), chr); if (entity_w && - (skip_quot || (entity_w[0] != L'"')) && - (skip_apos || (entity_w[0] != L'\'')) && - (skip_amp || (entity_w[0] != L'&')) && - (skip_lt_gt || (entity_w[0] != L'<' && entity_w[0] != L'>')) && - (skip_bsol || (entity_w[0] != L'\\')) && - (skip_dollar || (entity_w[0] != L'$')) && - (skip_percnt || (entity_w[0] != L'%')) && - (skip_commat || (entity_w[0] != L'@')) && - (skip_num || (entity_w[0] != L'#')) && - (skip_lpar_rpar || (entity_w[0] != L'(' && entity_w[0] != L')')) && - (skip_lcub_rcub || (entity_w[0] != L'{' && entity_w[0] != L'}')) && - (skip_lsqb_rsqb || (entity_w[0] != L'[' && entity_w[0] != L']'))) + (skip_quot || (entity_w[0] != '"')) && + (skip_apos || (entity_w[0] != '\'')) && + (skip_amp || (entity_w[0] != '&')) && + (skip_lt_gt || (entity_w[0] != '<' && entity_w[0] != '>')) && + (skip_bsol || (entity_w[0] != '\\')) && + (skip_dollar || (entity_w[0] != '$')) && + (skip_percnt || (entity_w[0] != '%')) && + (skip_commat || (entity_w[0] != '@')) && + (skip_num || (entity_w[0] != '#')) && + (skip_lpar_rpar || (entity_w[0] != '(' && entity_w[0] != ')')) && + (skip_lcub_rcub || (entity_w[0] != '{' && entity_w[0] != '}')) && + (skip_lsqb_rsqb || (entity_w[0] != '[' && entity_w[0] != ']'))) { if (map) map->push_back(mapping(offset.from + i, offset.to + dst.size())); dst.append(entity_w); @@ -252,7 +236,7 @@ namespace stdex } /// - /// Convert SGML string to Unicode (UTF-16 on Windows) and append to string + /// Convert SGML string to Unicode and append to string /// /// \param[in,out] dst String to append Unicode to /// \param[in] src SGML string @@ -260,9 +244,9 @@ namespace stdex /// \param[in] offset Logical starting offset of source and destination strings. Unused when map parameter is nullptr. /// \param[in,out] map The vector to append index mapping between source and destination string to. /// - template , class AX_to = std::allocator, class TR_from = std::char_traits, class AX_from = std::allocator> + template , class AX_to = std::allocator, class TR_from = std::char_traits, class AX_from = std::allocator> void sgml2strcat( - _Inout_ std::basic_string& dst, + _Inout_ std::basic_string& dst, _In_ const std::basic_string& src, _In_ int skip = 0, _In_ const mapping& offset = mapping(0, 0), @@ -272,7 +256,7 @@ namespace stdex } /// - /// Convert SGML string to Unicode (UTF-16 on Windows) and append to string + /// Convert SGML string to Unicode and append to string /// /// \param[in,out] dst String to append Unicode to /// \param[in] count_dst Unicode string character count limit. Function throws std::invalid_argument if there is not enough space in Unicode string (including space for zero-terminator). @@ -284,9 +268,9 @@ namespace stdex /// /// \return Final length of SGML string in code points excluding zero-terminator /// - template + template size_t sgml2strcat( - _Inout_cap_(count_dst) wchar_t* dst, _In_ size_t count_dst, + _Inout_cap_(count_dst) T_to* dst, _In_ size_t count_dst, _In_reads_or_z_opt_(count_src) const T_from* src, _In_ size_t count_src, _In_ int skip = 0, _In_ const mapping& offset = mapping(0, 0), @@ -314,54 +298,31 @@ namespace stdex count_src = strnlen(src, count_src); for (size_t i = 0; i < count_src;) { if (src[i] == '&') { - auto end = sgmlend(src + i + 1, count_src - i - 1); + auto end = sgmlend(&src[i + 1], count_src - i - 1); if (end) { - const wchar_t* entity_w; - wchar_t chr[3]; + utf32_t chr32[2]; + T_to chr[5]; size_t n = end - src - i - 1; - if (n >= 2 && src[i + 1] == '#') { - utf32_t unicode; - if (src[i + 2] == 'x' || src[i + 2] == 'X') - unicode = strtou32(src + i + 3, n - 2, nullptr, 16); - else - unicode = strtou32(src + i + 2, n - 1, nullptr, 10); -#ifdef _WIN32 - if (unicode < 0x10000) { - chr[0] = (wchar_t)unicode; - chr[1] = 0; - } - else { - ucs4_to_surrogate_pair(chr, unicode); - chr[2] = 0; - } -#else - chr[0] = (wchar_t)unicode; - chr[1] = 0; -#endif - entity_w = chr; - } - else - entity_w = sgml2uni(src + i + 1, n); - + auto entity_w = utf32_to_wstr(sgml2uni(&src[i + 1], n, chr32), chr); if (entity_w && - (skip_quot || (entity_w[0] != L'"')) && - (skip_apos || (entity_w[0] != L'\'')) && - (skip_amp || (entity_w[0] != L'&')) && - (skip_lt_gt || (entity_w[0] != L'<' && entity_w[0] != L'>')) && - (skip_bsol || (entity_w[0] != L'\\')) && - (skip_dollar || (entity_w[0] != L'$')) && - (skip_percnt || (entity_w[0] != L'%')) && - (skip_commat || (entity_w[0] != L'@')) && - (skip_num || (entity_w[0] != L'#')) && - (skip_lpar_rpar || (entity_w[0] != L'(' && entity_w[0] != L')')) && - (skip_lcub_rcub || (entity_w[0] != L'{' && entity_w[0] != L'}')) && - (skip_lsqb_rsqb || (entity_w[0] != L'[' && entity_w[0] != L']'))) + (skip_quot || (entity_w[0] != '"')) && + (skip_apos || (entity_w[0] != '\'')) && + (skip_amp || (entity_w[0] != '&')) && + (skip_lt_gt || (entity_w[0] != '<' && entity_w[0] != '>')) && + (skip_bsol || (entity_w[0] != '\\')) && + (skip_dollar || (entity_w[0] != '$')) && + (skip_percnt || (entity_w[0] != '%')) && + (skip_commat || (entity_w[0] != '@')) && + (skip_num || (entity_w[0] != '#')) && + (skip_lpar_rpar || (entity_w[0] != '(' && entity_w[0] != ')')) && + (skip_lcub_rcub || (entity_w[0] != '{' && entity_w[0] != '}')) && + (skip_lsqb_rsqb || (entity_w[0] != '[' && entity_w[0] != ']'))) { if (map) map->push_back(mapping(offset.from + i, offset.to + j)); - size_t m = wcslen(entity_w); + size_t m = strlen(entity_w); if (j + m >= count_dst) throw buffer_overrun; - memcpy(dst + j, entity_w, m * sizeof(wchar_t)); j += m; + memcpy(dst + j, entity_w, m * sizeof(*entity_w)); j += m; i = end - src + 1; if (map) map->push_back(mapping(offset.from + i, offset.to + j)); continue; @@ -379,7 +340,7 @@ namespace stdex } /// - /// Convert SGML string to Unicode (UTF-16 on Windows) + /// Convert SGML string to Unicode /// /// \param[in,out] dst String to write Unicode to /// \param[in] src SGML string @@ -388,9 +349,9 @@ namespace stdex /// \param[in] offset Logical starting offset of source and destination strings. Unused when map parameter is nullptr. /// \param[in,out] map The vector to write index mapping between source and destination string to. /// - template , class AX_to = std::allocator> + template , class AX_to = std::allocator> void sgml2strcpy( - _Inout_ std::basic_string& dst, + _Inout_ std::basic_string& dst, _In_reads_or_z_opt_(count_src) const T_from* src, _In_ size_t count_src, _In_ int skip = 0, _In_ const mapping& offset = mapping(0, 0), @@ -403,7 +364,7 @@ namespace stdex } /// - /// Convert SGML string to Unicode (UTF-16 on Windows) + /// Convert SGML string to Unicode /// /// \param[in,out] dst String to write Unicode to /// \param[in] src SGML string @@ -411,9 +372,9 @@ namespace stdex /// \param[in] offset Logical starting offset of source and destination strings. Unused when map parameter is nullptr. /// \param[in,out] map The vector to write index mapping between source and destination string to. /// - template, class AX_to = std::allocator, class TR_from = std::char_traits, class AX_from = std::allocator> + template, class AX_to = std::allocator, class TR_from = std::char_traits, class AX_from = std::allocator> void sgml2strcpy( - _Inout_ std::basic_string& dst, + _Inout_ std::basic_string& dst, _In_ const std::basic_string& src, _In_ int skip = 0, _In_ const mapping& offset = mapping(0, 0), @@ -423,7 +384,7 @@ namespace stdex } /// - /// Convert SGML string to Unicode (UTF-16 on Windows) + /// Convert SGML string to Unicode /// /// \param[in,out] dst String to write Unicode to /// \param[in] count_dst Unicode string character count limit. Function throws std::invalid_argument if there is not enough space in Unicode string (including space for zero-terminator). @@ -435,9 +396,9 @@ namespace stdex /// /// \return Final length of SGML string in code points excluding zero-terminator /// - template + template size_t sgml2strcpy( - _Inout_cap_(count_dst) wchar_t* dst, _In_ size_t count_dst, + _Inout_cap_(count_dst) T_to* dst, _In_ size_t count_dst, _In_reads_or_z_opt_(count_src) const T_from* src, _In_ size_t count_src, _In_ int skip = 0, _In_ const mapping& offset = mapping(0, 0), @@ -452,7 +413,7 @@ namespace stdex } /// - /// Convert SGML string to Unicode string (UTF-16 on Windows) + /// Convert SGML string to Unicode string /// /// \param[in] src SGML string /// \param[in] count_src SGML string character count limit @@ -462,14 +423,14 @@ namespace stdex /// /// \return Unicode string /// - template - std::wstring sgml2str( + template , class AX_to = std::allocator> + std::basic_string sgml2str( _In_reads_or_z_opt_(count_src) const T_from* src, _In_ size_t count_src, _In_ int skip = 0, _In_ const mapping& offset = mapping(0, 0), _Inout_opt_ mapping_vector* map = nullptr) { - std::wstring dst; + std::basic_string dst; sgml2strcat(dst, src, count_src, skip, offset, map); return dst; } @@ -484,25 +445,61 @@ namespace stdex /// /// \return Unicode string /// - template , class AX_from = std::allocator> - std::wstring sgml2str( + template , class AX_to = std::allocator, class TR_from = std::char_traits, class AX_from = std::allocator> + std::basic_string sgml2str( _In_ const std::basic_string& src, _In_ int skip = 0, _In_ const mapping& offset = mapping(0, 0), _Inout_opt_ mapping_vector* map = nullptr) { - return sgml2str(src.data(), src.size(), skip, offset, map); + return sgml2str(src.data(), src.size(), skip, offset, map); } /// \cond internal - inline const char* chr2sgml(_In_reads_or_z_(count) const wchar_t* entity, _In_ size_t count) + inline const char* chr2sgml(_In_reads_or_z_(count) const utf16_t* entity, _In_ size_t count) { _Assume_(entity && count); - const wchar_t e2 = entity[0]; + utf32_t e2; + size_t offset; + if (count < 2 || !is_surrogate_pair(entity)) { + e2 = static_cast(entity[0]); + offset = 1; + } + else { + e2 = surrogate_pair_to_ucs4(entity); + offset = 2; + } for (size_t i = 0, j = _countof(unicode_sgml); i < j; ) { size_t m = (i + j) / 2; - wchar_t e1 = sgml_unicode[unicode_sgml[m]].unicode[0]; + auto e1 = sgml_unicode[unicode_sgml[m]].unicode[0]; + if (e1 < e2) + i = m + 1; + else if (e1 > e2) + j = m; + else { + auto r = strncmp(sgml_unicode[unicode_sgml[m]].unicode + 1, _countof(sgml_unicode[0].unicode) - 1, entity + offset, count - offset); + if (r < 0) + i = m + 1; + else if (r > 0) + j = m; + else { + for (; i < m && sgml_unicode[unicode_sgml[m - 1]].unicode[0] == e2 && strncmp(sgml_unicode[unicode_sgml[m - 1]].unicode + 1, _countof(sgml_unicode[0].unicode) - 1, entity + offset, count - offset) == 0; m--); + return sgml_unicode[unicode_sgml[m]].sgml; + } + } + } + return nullptr; + } + + inline const char* chr2sgml(_In_reads_or_z_(count) const utf32_t* entity, _In_ size_t count) + { + _Assume_(entity && count); + + utf32_t e2 = entity[0]; + for (size_t i = 0, j = _countof(unicode_sgml); i < j; ) { + size_t m = (i + j) / 2; + auto e1 = sgml_unicode[unicode_sgml[m]].unicode[0]; if (e1 < e2) i = m + 1; else if (e1 > e2) @@ -521,20 +518,37 @@ namespace stdex } return nullptr; } + + inline utf32_t wstr_to_utf32(_In_reads_(end) const utf16_t* src, _Inout_ size_t& i, _In_ size_t end) + { + _Assume_(i < end); + if (i + 1 >= end || !is_surrogate_pair(src + i)) + return src[i++]; + + utf32_t unicode = surrogate_pair_to_ucs4(src + i); + i += 2; + return unicode; + } + + inline utf32_t wstr_to_utf32(_In_reads_(end) const utf32_t* src, _Inout_ size_t& i, _In_ size_t end) + { + _Assume_(i < end); + return src[i++]; + } /// \endcond /// - /// Convert Unicode string (UTF-16 on Windows) to SGML and append to string + /// Convert Unicode string to SGML and append to string /// /// \param[in,out] dst String to append SGML to /// \param[in] src Unicode string /// \param[in] count_src Unicode string character count limit /// \param[in] what Bitwise flag of stdex::sgml_* constants that force extra characters otherwise not converted to SGML /// - template , class AX_to = std::allocator> - inline void str2sgmlcat( + template , class AX_to = std::allocator> + void str2sgmlcat( _Inout_ std::basic_string& dst, - _In_reads_or_z_opt_(count_src) const wchar_t* src, _In_ size_t count_src, + _In_reads_or_z_opt_(count_src) const T_from* src, _In_ size_t count_src, _In_ int what = 0) { _Assume_(src || !count_src); @@ -559,18 +573,18 @@ namespace stdex size_t n = glyphlen(src + i, count_src - i); if (n == 1 && do_ascii && is7bit(src[i]) && - src[i] != L'&' && - (do_quot || (src[i] != L'"')) && - (do_apos || (src[i] != L'\'')) && - (do_lt_gt || (src[i] != L'<' && src[i] != L'>')) && - (do_bsol || (src[i] != L'\\')) && - (do_dollar || (src[i] != L'$')) && - (do_percnt || (src[i] != L'%')) && - (do_commat || (src[i] != L'@')) && - (do_num || (src[i] != L'#')) && - (do_lpar_rpar || (src[i] != L'(' && src[i] != L')')) && - (do_lcub_rcub || (src[i] != L'{' && src[i] != L'}')) && - (do_lsqb_rsqb || (src[i] != L'[' && src[i] != L']'))) + src[i] != '&' && + (do_quot || (src[i] != '"')) && + (do_apos || (src[i] != '\'')) && + (do_lt_gt || (src[i] != '<' && src[i] != '>')) && + (do_bsol || (src[i] != '\\')) && + (do_dollar || (src[i] != '$')) && + (do_percnt || (src[i] != '%')) && + (do_commat || (src[i] != '@')) && + (do_num || (src[i] != '#')) && + (do_lpar_rpar || (src[i] != '(' && src[i] != ')')) && + (do_lcub_rcub || (src[i] != '{' && src[i] != '}')) && + (do_lsqb_rsqb || (src[i] != '[' && src[i] != ']'))) { // 7-bit ASCII and no desire to encode it as an SGML entity. dst.append(1, static_cast(src[i++])); @@ -589,7 +603,7 @@ namespace stdex dst.append(1, static_cast(src[i++])); else { char tmp[3 + 8 + 1 + 1]; - snprintf(tmp, _countof(tmp), "&#x%x;", src[i++]); + snprintf(tmp, _countof(tmp), "&#x%x;", static_cast(src[i++])); dst.append(tmp); } } @@ -606,19 +620,8 @@ namespace stdex else if (is7bit(src[i])) dst.append(1, static_cast(src[i++])); else { - utf32_t unicode; -#ifdef _WIN32 - if (i + 1 < end && is_surrogate_pair(src + i)) { - unicode = surrogate_pair_to_ucs4(src + i); - i += 2; - } - else -#endif - { - unicode = src[i++]; - } char tmp[3 + 8 + 1 + 1]; - snprintf(tmp, _countof(tmp), "&#x%x;", static_cast(unicode)); + snprintf(tmp, _countof(tmp), "&#x%x;", static_cast(wstr_to_utf32(src, i, end))); dst.append(tmp); } } @@ -628,23 +631,23 @@ namespace stdex } /// - /// Convert Unicode string (UTF-16 on Windows) to SGML and append to string + /// Convert Unicode string to SGML and append to string /// /// \param[in,out] dst String to append SGML to /// \param[in] src Unicode string /// \param[in] what Bitwise flag of stdex::sgml_* constants that force extra characters otherwise not converted to SGML /// - template , class AX_to = std::allocator> + template , class AX_to = std::allocator> void str2sgmlcat( _Inout_ std::basic_string& dst, - _In_ const std::basic_string_view> src, + _In_ const std::basic_string_view> src, _In_ int what = 0) { str2sgmlcat(dst, src.data(), src.size(), what); } /// - /// Convert Unicode string (UTF-16 on Windows) to SGML and append to string + /// Convert Unicode string to SGML and append to string /// /// \param[in,out] dst String to append SGML to /// \param[in] count_dst SGML string character count limit. Function throws std::invalid_argument if there is not enough space in SGML string (including space for zero-terminator). @@ -654,9 +657,10 @@ namespace stdex /// /// \return Final length of SGML string in code points excluding zero-terminator /// - inline size_t str2sgmlcat( + template + size_t str2sgmlcat( _Inout_cap_(count_dst) char* dst, _In_ size_t count_dst, - _In_reads_or_z_opt_(count_src) const wchar_t* src, _In_ size_t count_src, + _In_reads_or_z_opt_(count_src) const T_from* src, _In_ size_t count_src, _In_ int what = 0) { _Assume_(dst || !count_dst); @@ -683,18 +687,18 @@ namespace stdex size_t n = glyphlen(src + i, count_src - i); if (n == 1 && do_ascii && is7bit(src[i]) && - src[i] != L'&' && - (do_quot || (src[i] != L'"')) && - (do_apos || (src[i] != L'\'')) && - (do_lt_gt || (src[i] != L'<' && src[i] != L'>')) && - (do_bsol || (src[i] != L'\\')) && - (do_dollar || (src[i] != L'$')) && - (do_percnt || (src[i] != L'%')) && - (do_commat || (src[i] != L'@')) && - (do_num || (src[i] != L'#')) && - (do_lpar_rpar || (src[i] != L'(' && src[i] != L')')) && - (do_lcub_rcub || (src[i] != L'{' && src[i] != L'}')) && - (do_lsqb_rsqb || (src[i] != L'[' && src[i] != L']'))) + src[i] != '&' && + (do_quot || (src[i] != '"')) && + (do_apos || (src[i] != '\'')) && + (do_lt_gt || (src[i] != '<' && src[i] != '>')) && + (do_bsol || (src[i] != '\\')) && + (do_dollar || (src[i] != '$')) && + (do_percnt || (src[i] != '%')) && + (do_commat || (src[i] != '@')) && + (do_num || (src[i] != '#')) && + (do_lpar_rpar || (src[i] != '(' && src[i] != ')')) && + (do_lcub_rcub || (src[i] != '{' && src[i] != '}')) && + (do_lsqb_rsqb || (src[i] != '[' && src[i] != ']'))) { // 7-bit ASCII and no desire to encode it as an SGML entity. if (j + 1 >= count_dst) @@ -721,7 +725,7 @@ namespace stdex } else { char tmp[3 + 8 + 1 + 1]; - int m = snprintf(tmp, _countof(tmp), "&#x%x;", src[i++]); + int m = snprintf(tmp, _countof(tmp), "&#x%x;", static_cast(src[i++])); _Assume_(m >= 0); if (static_cast(m) >= count_dst) throw buffer_overrun; @@ -748,19 +752,8 @@ namespace stdex dst[j++] = static_cast(src[i++]); } else { - utf32_t unicode; -#ifdef _WIN32 - if (i + 1 < end && is_surrogate_pair(src + i)) { - unicode = surrogate_pair_to_ucs4(src + i); - i += 2; - } - else -#endif - { - unicode = src[i++]; - } char tmp[3 + 8 + 1 + 1]; - int m = snprintf(tmp, _countof(tmp), "&#x%x;", static_cast(unicode)); + int m = snprintf(tmp, _countof(tmp), "&#x%x;", static_cast(wstr_to_utf32(src, i, end))); _Assume_(m >= 0); if (static_cast(m) >= count_dst) throw buffer_overrun; @@ -778,17 +771,17 @@ namespace stdex } /// - /// Convert Unicode string (UTF-16 on Windows) to SGML + /// Convert Unicode string to SGML /// /// \param[in,out] dst String to write SGML to /// \param[in] src Unicode string /// \param[in] count_src Unicode string character count limit /// \param[in] what Bitwise flag of stdex::sgml_* constants that force extra characters otherwise not converted to SGML /// - template , class AX_to = std::allocator> - inline void str2sgmlcpy( + template , class AX_to = std::allocator> + void str2sgmlcpy( _Inout_ std::basic_string& dst, - _In_reads_or_z_opt_(count_src) const wchar_t* src, _In_ size_t count_src, + _In_reads_or_z_opt_(count_src) const T_from* src, _In_ size_t count_src, _In_ int what = 0) { dst.clear(); @@ -796,23 +789,23 @@ namespace stdex } /// - /// Convert Unicode string (UTF-16 on Windows) to SGML + /// Convert Unicode string to SGML /// /// \param[in,out] dst String to write SGML to /// \param[in] src Unicode string /// \param[in] what Bitwise flag of stdex::sgml_* constants that force extra characters otherwise not converted to SGML /// - template , class AX_to = std::allocator> + template , class AX_to = std::allocator> void str2sgmlcpy( _Inout_ std::basic_string& dst, - _In_ const std::basic_string_view> src, + _In_ const std::basic_string_view> src, _In_ int what = 0) { str2sgmlcpy(dst, src.data(), src.size(), what); } /// - /// Convert Unicode string (UTF-16 on Windows) to SGML + /// Convert Unicode string to SGML /// /// \param[in,out] dst String to write SGML to /// \param[in] count_dst SGML string character count limit. Function throws std::invalid_argument if there is not enough space in SGML string (including space for zero-terminator). @@ -822,9 +815,10 @@ namespace stdex /// /// \return Final length of SGML string in code points excluding zero-terminator /// - inline size_t str2sgmlcpy( + template + size_t str2sgmlcpy( _Inout_cap_(count_dst) char* dst, _In_ size_t count_dst, - _In_reads_or_z_opt_(count_src) const wchar_t* src, _In_ size_t count_src, + _In_reads_or_z_opt_(count_src) const T_from* src, _In_ size_t count_src, _In_ int what = 0) { _Assume_(dst || !count_dst); @@ -834,7 +828,7 @@ namespace stdex } /// - /// Convert Unicode string (UTF-16 on Windows) to SGML string + /// Convert Unicode string to SGML string /// /// \param[in] src Unicode string /// \param[in] count_src Unicode string character count limit @@ -842,8 +836,9 @@ namespace stdex /// /// \return SGML string /// - inline std::string str2sgml( - _In_reads_or_z_opt_(count_src) const wchar_t* src, _In_ size_t count_src, + template + std::string str2sgml( + _In_reads_or_z_opt_(count_src) const T_from* src, _In_ size_t count_src, _In_ int what = 0) { std::string dst; @@ -852,15 +847,16 @@ namespace stdex } /// - /// Convert Unicode string (UTF-16 on Windows) to SGML string + /// Convert Unicode string to SGML string /// /// \param[in] src Unicode string /// \param[in] what Bitwise flag of stdex::sgml_* constants that force extra characters otherwise not converted to SGML /// /// \return SGML string /// - inline std::string str2sgml( - _In_ const std::basic_string_view> src, + template + std::string str2sgml( + _In_ const std::basic_string_view> src, _In_ int what = 0) { return str2sgml(src.data(), src.size(), what); diff --git a/include/stdex/sgml_unicode.hpp b/include/stdex/sgml_unicode.hpp index 7755aa0c9..8b4adb8f5 100644 --- a/include/stdex/sgml_unicode.hpp +++ b/include/stdex/sgml_unicode.hpp @@ -5,1550 +5,1552 @@ #pragma once +#include "string.hpp" + namespace stdex { /// \cond internal struct sgml_unicode_pair { char sgml[12]; ///< Entity name (without leading & and trailing ;) - wchar_t unicode[3]; ///< Unicode string representation + utf32_t unicode[3]; ///< UTF-32 string representation }; inline const sgml_unicode_pair sgml_unicode[] = { - { "AElig", L"\u00c6" }, - { "Aacgr", L"\u0386" }, - { "Aacute", L"\u00c1" }, - { "Aacute", L"\u0041\u0301" }, - { "Abreve", L"\u0102" }, - { "Abreve", L"\u0041\u0306" }, - { "Abring", L"\u0041\u032f" }, - { "Acaron", L"\u0041\u030c" }, - { "Acirc", L"\u00c2" }, - { "Acirc", L"\u0041\u0302" }, - { "Acy", L"\u0410" }, - { "Adot", L"\u0041\u0307" }, - { "Agr", L"\u0391" }, - { "Agrave", L"\u00c0" }, - { "Agrave", L"\u0041\u0300" }, - { "Alpha", L"\u0391" }, - { "Amacr", L"\u0100" }, - { "Amacr", L"\u0041\u0304" }, - { "Aogon", L"\u0104" }, - { "Aring", L"\u00c5" }, - { "Atilde", L"\u00c3" }, - { "Atilde", L"\u0041\u0303" }, - { "Auml", L"\u00c4" }, - { "Auml", L"\u0041\u0308" }, - { "Bacute", L"\u0042\u0301" }, - { "Barwed", L"\u2306" }, - { "Bbreve", L"\u0042\u0306" }, - { "Bbring", L"\u0042\u032f" }, - { "Bcaron", L"\u0042\u030c" }, - { "Bcirc", L"\u0042\u0302" }, - { "Bcy", L"\u0411" }, - { "Bdot", L"\u0042\u0307" }, - { "Beta", L"\u0392" }, - { "Bgr", L"\u0392" }, - { "Bgrave", L"\u0042\u0300" }, - { "Bmacr", L"\u0042\u0304" }, - { "Btilde", L"\u0042\u0303" }, - { "Buml", L"\u0042\u0308" }, - { "CHcy", L"\u0427" }, - { "Cacute", L"\u0106" }, - { "Cacute", L"\u0043\u0301" }, - { "Cap", L"\u22d2" }, - { "Cbreve", L"\u0043\u0306" }, - { "Cbring", L"\u0043\u032f" }, - { "Ccaron", L"\u010c" }, - { "Ccaron", L"\u0043\u030c" }, - { "Ccedil", L"\u00c7" }, - { "Ccirc", L"\u0108" }, - { "Ccirc", L"\u0043\u0302" }, - { "Cdot", L"\u010a" }, - { "Cdot", L"\u0043\u0307" }, - { "Cgrave", L"\u0043\u0300" }, - { "Chi", L"\u03a7" }, - { "Cmacr", L"\u0043\u0304" }, - { "Ctilde", L"\u0043\u0303" }, - { "Cuml", L"\u0043\u0308" }, - { "Cup", L"\u22d3" }, - { "DJcy", L"\u0402" }, - { "DScy", L"\u0405" }, - { "DZcy", L"\u040f" }, - { "Dacute", L"\u0044\u0301" }, - { "Dagger", L"\u2021" }, - { "Dbreve", L"\u0044\u0306" }, - { "Dbring", L"\u0044\u032f" }, - { "Dcaron", L"\u010e" }, - { "Dcaron", L"\u0044\u030c" }, - { "Dcirc", L"\u0044\u0302" }, - { "Dcy", L"\u0414" }, - { "Ddot", L"\u0044\u0307" }, - { "Delta", L"\u0394" }, - { "Dgr", L"\u0394" }, - { "Dgrave", L"\u0044\u0300" }, - { "Dmacr", L"\u0044\u0304" }, - { "Dot", L"\u00a8" }, - { "DotDot", L"\u20dc" }, - { "Dstrok", L"\u0110" }, - { "Dtilde", L"\u0044\u0303" }, - { "Duml", L"\u0044\u0308" }, - { "EEacgr", L"\u0389" }, - { "EEgr", L"\u0397" }, - { "ENG", L"\u014a" }, - { "ETH", L"\u00d0" }, - { "Eacgr", L"\u0388" }, - { "Eacute", L"\u00c9" }, - { "Eacute", L"\u0045\u0301" }, - { "Ebreve", L"\u0045\u0306" }, - { "Ebring", L"\u0045\u032f" }, - { "Ecaron", L"\u011a" }, - { "Ecaron", L"\u0045\u030c" }, - { "Ecirc", L"\u00ca" }, - { "Ecirc", L"\u0045\u0302" }, - { "Ecy", L"\u042d" }, - { "Edot", L"\u0116" }, - { "Edot", L"\u0045\u0307" }, - { "Edotb", L"\u1eb8" }, - { "Egr", L"\u0395" }, - { "Egrave", L"\u00c8" }, - { "Egrave", L"\u0045\u0300" }, - { "Emacr", L"\u0112" }, - { "Emacr", L"\u0045\u0304" }, - { "Eogon", L"\u0118" }, - { "Epsilon", L"\u0395" }, - { "Eta", L"\u0397" }, - { "Etilde", L"\u0045\u0303" }, - { "Euml", L"\u00cb" }, - { "Euml", L"\u0045\u0308" }, - { "Facute", L"\u0046\u0301" }, - { "Fbreve", L"\u0046\u0306" }, - { "Fbring", L"\u0046\u032f" }, - { "Fcaron", L"\u0046\u030c" }, - { "Fcirc", L"\u0046\u0302" }, - { "Fcy", L"\u0424" }, - { "Fdot", L"\u0046\u0307" }, - { "Fgrave", L"\u0046\u0300" }, - { "Fmacr", L"\u0046\u0304" }, - { "Ftilde", L"\u0046\u0303" }, - { "Fuml", L"\u0046\u0308" }, - { "GJcy", L"\u0403" }, - { "Gacute", L"\u0047\u0301" }, - { "Gamma", L"\u0393" }, - { "Gbreve", L"\u011e" }, - { "Gbreve", L"\u0047\u0306" }, - { "Gbring", L"\u0047\u032f" }, - { "Gcaron", L"\u0047\u030c" }, - { "Gcedil", L"\u0122" }, - { "Gcirc", L"\u011c" }, - { "Gcirc", L"\u0047\u0302" }, - { "Gcy", L"\u0413" }, - { "Gdot", L"\u0120" }, - { "Gdot", L"\u0047\u0307" }, - { "Gg", L"\u22d9" }, - { "Ggr", L"\u0393" }, - { "Ggrave", L"\u0047\u0300" }, - { "Gmacr", L"\u0047\u0304" }, - { "Gt", L"\u226b" }, - { "Gtilde", L"\u0047\u0303" }, - { "Guml", L"\u0047\u0308" }, - { "HARDcy", L"\u042a" }, - { "Hacute", L"\u0048\u0301" }, - { "Hbreve", L"\u0048\u0306" }, - { "Hbring", L"\u0048\u032f" }, - { "Hcaron", L"\u0048\u030c" }, - { "Hcirc", L"\u0124" }, - { "Hcirc", L"\u0048\u0302" }, - { "Hdot", L"\u0048\u0307" }, - { "Hgrave", L"\u0048\u0300" }, - { "Hmacr", L"\u0048\u0304" }, - { "Hstrok", L"\u0126" }, - { "Htilde", L"\u0048\u0303" }, - { "Huml", L"\u0048\u0308" }, - { "IEcy", L"\u0415" }, - { "IJlig", L"\u0132" }, - { "IOcy", L"\u0401" }, - { "Iacgr", L"\u038a" }, - { "Iacute", L"\u00cd" }, - { "Iacute", L"\u0049\u0301" }, - { "Ibreve", L"\u0049\u0306" }, - { "Ibring", L"\u0049\u032f" }, - { "Icaron", L"\u0049\u030c" }, - { "Icirc", L"\u00ce" }, - { "Icirc", L"\u0049\u0302" }, - { "Icy", L"\u0418" }, - { "Idigr", L"\u03aa" }, - { "Idot", L"\u0130" }, - { "Idot", L"\u0049\u0307" }, - { "Igr", L"\u0399" }, - { "Igrave", L"\u00cc" }, - { "Igrave", L"\u0049\u0300" }, - { "Imacr", L"\u012a" }, - { "Imacr", L"\u0049\u0304" }, - { "Iogon", L"\u012e" }, - { "Iota", L"\u0399" }, - { "Itilde", L"\u0128" }, - { "Itilde", L"\u0049\u0303" }, - { "Iukcy", L"\u0406" }, - { "Iuml", L"\u00cf" }, - { "Iuml", L"\u0049\u0308" }, - { "Jacute", L"\u004a\u0301" }, - { "Jbreve", L"\u004a\u0306" }, - { "Jbring", L"\u004a\u032f" }, - { "Jcaron", L"\u004a\u030c" }, - { "Jcirc", L"\u0134" }, - { "Jcirc", L"\u004a\u0302" }, - { "Jcy", L"\u0419" }, - { "Jdot", L"\u004a\u0307" }, - { "Jgrave", L"\u004a\u0300" }, - { "Jmacr", L"\u004a\u0304" }, - { "Jsercy", L"\u0408" }, - { "Jtilde", L"\u004a\u0303" }, - { "Jukcy", L"\u0404" }, - { "Juml", L"\u004a\u0308" }, - { "KHcy", L"\u0425" }, - { "KHgr", L"\u03a7" }, - { "KJcy", L"\u040c" }, - { "Kacute", L"\u004b\u0301" }, - { "Kappa", L"\u039a" }, - { "Kbreve", L"\u004b\u0306" }, - { "Kbring", L"\u004b\u032f" }, - { "Kcaron", L"\u004b\u030c" }, - { "Kcedil", L"\u0136" }, - { "Kcirc", L"\u004b\u0302" }, - { "Kcy", L"\u041a" }, - { "Kdot", L"\u004b\u0307" }, - { "Kgr", L"\u039a" }, - { "Kgrave", L"\u004b\u0300" }, - { "Kmacr", L"\u004b\u0304" }, - { "Ktilde", L"\u004b\u0303" }, - { "Kuml", L"\u004b\u0308" }, - { "LJcy", L"\u0409" }, - { "Lacute", L"\u0139" }, - { "Lacute", L"\u004c\u0301" }, - { "Lambda", L"\u039b" }, - { "Larr", L"\u219e" }, - { "Lbreve", L"\u004c\u0306" }, - { "Lbring", L"\u004c\u032f" }, - { "Lcaron", L"\u013d" }, - { "Lcaron", L"\u004c\u030c" }, - { "Lcedil", L"\u013b" }, - { "Lcirc", L"\u004c\u0302" }, - { "Lcy", L"\u041b" }, - { "Ldot", L"\u004c\u0307" }, - { "Lgr", L"\u039b" }, - { "Lgrave", L"\u004c\u0300" }, - { "Ll", L"\u22d8" }, - { "Lmacr", L"\u004c\u0304" }, - { "Lmidot", L"\u013f" }, - { "Lstrok", L"\u0141" }, - { "Lt", L"\u226a" }, - { "Ltilde", L"\u004c\u0303" }, - { "Luml", L"\u004c\u0308" }, - { "Macute", L"\u004d\u0301" }, - { "Mbreve", L"\u004d\u0306" }, - { "Mbring", L"\u004d\u032f" }, - { "Mcaron", L"\u004d\u030c" }, - { "Mcirc", L"\u004d\u0302" }, - { "Mcy", L"\u041c" }, - { "Mdot", L"\u004d\u0307" }, - { "Mgr", L"\u039c" }, - { "Mgrave", L"\u004d\u0300" }, - { "Mmacr", L"\u004d\u0304" }, - { "Mtilde", L"\u004d\u0303" }, - { "Mu", L"\u039c" }, - { "Muml", L"\u004d\u0308" }, - { "NJcy", L"\u040a" }, - { "Nacute", L"\u0143" }, - { "Nacute", L"\u004e\u0301" }, - { "Nbreve", L"\u004e\u0306" }, - { "Nbring", L"\u004e\u032f" }, - { "Ncaron", L"\u0147" }, - { "Ncaron", L"\u004e\u030c" }, - { "Ncedil", L"\u0145" }, - { "Ncirc", L"\u004e\u0302" }, - { "Ncy", L"\u041d" }, - { "Ndot", L"\u004e\u0307" }, - { "Ngr", L"\u039d" }, - { "Ngrave", L"\u004e\u0300" }, - { "Nmacr", L"\u004e\u0304" }, - { "Ntilde", L"\u00d1" }, - { "Ntilde", L"\u004e\u0303" }, - { "Nu", L"\u039d" }, - { "Numl", L"\u004e\u0308" }, - { "OElig", L"\u0152" }, - { "OHacgr", L"\u038f" }, - { "OHgr", L"\u03a9" }, - { "Oacgr", L"\u038c" }, - { "Oacute", L"\u00d3" }, - { "Oacute", L"\u004f\u0301" }, - { "Obreve", L"\u004f\u0306" }, - { "Obring", L"\u004f\u032f" }, - { "Ocaron", L"\u01d1" }, - { "Ocaron", L"\u004f\u030c" }, - { "Ocirc", L"\u00d4" }, - { "Ocirc", L"\u004f\u0302" }, - { "Ocy", L"\u041e" }, - { "Odblac", L"\u0150" }, - { "Odot", L"\u004f\u0307" }, - { "Odotb", L"\u1ecc" }, - { "Ogr", L"\u039f" }, - { "Ograve", L"\u00d2" }, - { "Ograve", L"\u004f\u0300" }, - { "Omacr", L"\u014c" }, - { "Omacr", L"\u004f\u0304" }, - { "Omega", L"\u03a9" }, - { "Omicron", L"\u039f" }, - { "Oslash", L"\u00d8" }, - { "Otilde", L"\u00d5" }, - { "Otilde", L"\u004f\u0303" }, - { "Ouml", L"\u00d6" }, - { "Ouml", L"\u004f\u0308" }, - { "PHgr", L"\u03a6" }, - { "PSgr", L"\u03a8" }, - { "Pacute", L"\u0050\u0301" }, - { "Pbreve", L"\u0050\u0306" }, - { "Pbring", L"\u0050\u032f" }, - { "Pcaron", L"\u0050\u030c" }, - { "Pcirc", L"\u0050\u0302" }, - { "Pcy", L"\u041f" }, - { "Pdot", L"\u0050\u0307" }, - { "Pgr", L"\u03a0" }, - { "Pgrave", L"\u0050\u0300" }, - { "Phi", L"\u03a6" }, - { "Pi", L"\u03a0" }, - { "Pmacr", L"\u0050\u0304" }, - { "Prime", L"\u2033" }, - { "Psi", L"\u03a8" }, - { "Ptilde", L"\u0050\u0303" }, - { "Puml", L"\u0050\u0308" }, - { "Qacute", L"\u0051\u0301" }, - { "Qbreve", L"\u0051\u0306" }, - { "Qbring", L"\u0051\u032f" }, - { "Qcaron", L"\u0051\u030c" }, - { "Qcirc", L"\u0051\u0302" }, - { "Qdot", L"\u0051\u0307" }, - { "Qgrave", L"\u0051\u0300" }, - { "Qmacr", L"\u0051\u0304" }, - { "Qtilde", L"\u0051\u0303" }, - { "Quml", L"\u0051\u0308" }, - { "Racute", L"\u0154" }, - { "Racute", L"\u0052\u0301" }, - { "Rarr", L"\u21a0" }, - { "Rbreve", L"\u0052\u0306" }, - { "Rbring", L"\u0052\u032f" }, - { "Rcaron", L"\u0158" }, - { "Rcaron", L"\u0052\u030c" }, - { "Rcedil", L"\u0156" }, - { "Rcirc", L"\u0052\u0302" }, - { "Rcy", L"\u0420" }, - { "Rdot", L"\u0052\u0307" }, - { "Rgr", L"\u03a1" }, - { "Rgrave", L"\u0052\u0300" }, - { "Rho", L"\u03a1" }, - { "Rmacr", L"\u0052\u0304" }, - { "Rtilde", L"\u0052\u0303" }, - { "Ruml", L"\u0052\u0308" }, - { "SHCHcy", L"\u0429" }, - { "SHcy", L"\u0428" }, - { "SOFTcy", L"\u042c" }, - { "Sacute", L"\u015a" }, - { "Sacute", L"\u0053\u0301" }, - { "Sbreve", L"\u0053\u0306" }, - { "Sbring", L"\u0053\u032f" }, - { "Scaron", L"\u0160" }, - { "Scaron", L"\u0053\u030c" }, - { "Scedil", L"\u015e" }, - { "Scirc", L"\u015c" }, - { "Scirc", L"\u0053\u0302" }, - { "Scy", L"\u0421" }, - { "Sdot", L"\u0053\u0307" }, - { "Sgr", L"\u03a3" }, - { "Sgrave", L"\u0053\u0300" }, - { "Sigma", L"\u03a3" }, - { "Smacr", L"\u0053\u0304" }, - { "Stilde", L"\u0053\u0303" }, - { "Sub", L"\u22d0" }, - { "Suml", L"\u0053\u0308" }, - { "Sup", L"\u22d1" }, - { "THORN", L"\u00de" }, - { "THgr", L"\u0398" }, - { "TSHcy", L"\u040b" }, - { "TScy", L"\u0426" }, - { "Tacute", L"\u0054\u0301" }, - { "Tau", L"\u03a4" }, - { "Tbreve", L"\u0054\u0306" }, - { "Tbring", L"\u0054\u032f" }, - { "Tcaron", L"\u0164" }, - { "Tcaron", L"\u0054\u030c" }, - { "Tcedil", L"\u0162" }, - { "Tcirc", L"\u0054\u0302" }, - { "Tcy", L"\u0422" }, - { "Tdot", L"\u0054\u0307" }, - { "Tgr", L"\u03a4" }, - { "Tgrave", L"\u0054\u0300" }, - { "Theta", L"\u0398" }, - { "Tmacr", L"\u0054\u0304" }, - { "Tstrok", L"\u0166" }, - { "Ttilde", L"\u0054\u0303" }, - { "Tuml", L"\u0054\u0308" }, - { "Uacgr", L"\u038e" }, - { "Uacute", L"\u00da" }, - { "Uacute", L"\u0055\u0301" }, - { "Ubrcy", L"\u040e" }, - { "Ubreve", L"\u016c" }, - { "Ubreve", L"\u0055\u0306" }, - { "Ubring", L"\u0055\u032f" }, - { "Ucaron", L"\u0055\u030c" }, - { "Ucirc", L"\u00db" }, - { "Ucirc", L"\u0055\u0302" }, - { "Ucy", L"\u0423" }, - { "Udblac", L"\u0170" }, - { "Udigr", L"\u03ab" }, - { "Udot", L"\u0055\u0307" }, - { "Ugr", L"\u03a5" }, - { "Ugrave", L"\u00d9" }, - { "Ugrave", L"\u0055\u0300" }, - { "Umacr", L"\u016a" }, - { "Umacr", L"\u0055\u0304" }, - { "Uogon", L"\u0172" }, - { "Upsi", L"\u03a5" }, - { "Upsilon", L"\u03a5" }, - { "Uring", L"\u016e" }, - { "Utilde", L"\u0168" }, - { "Utilde", L"\u0055\u0303" }, - { "Uuml", L"\u00dc" }, - { "Uuml", L"\u0055\u0308" }, - { "Vacute", L"\u0056\u0301" }, - { "Vbreve", L"\u0056\u0306" }, - { "Vbring", L"\u0056\u032f" }, - { "Vcaron", L"\u0056\u030c" }, - { "Vcirc", L"\u0056\u0302" }, - { "Vcy", L"\u0412" }, - { "Vdash", L"\u22a9" }, - { "Vdot", L"\u0056\u0307" }, - { "Verbar", L"\u2016" }, - { "Vgrave", L"\u0056\u0300" }, - { "Vmacr", L"\u0056\u0304" }, - { "Vtilde", L"\u0056\u0303" }, - { "Vuml", L"\u0056\u0308" }, - { "Vvdash", L"\u22aa" }, - { "Wacute", L"\u0057\u0301" }, - { "Wbreve", L"\u0057\u0306" }, - { "Wbring", L"\u0057\u032f" }, - { "Wcaron", L"\u0057\u030c" }, - { "Wcirc", L"\u0174" }, - { "Wcirc", L"\u0057\u0302" }, - { "Wdot", L"\u0057\u0307" }, - { "Wgrave", L"\u0057\u0300" }, - { "Wmacr", L"\u0057\u0304" }, - { "Wtilde", L"\u0057\u0303" }, - { "Wuml", L"\u0057\u0308" }, - { "Xacute", L"\u0058\u0301" }, - { "Xbreve", L"\u0058\u0306" }, - { "Xbring", L"\u0058\u032f" }, - { "Xcaron", L"\u0058\u030c" }, - { "Xcirc", L"\u0058\u0302" }, - { "Xdot", L"\u0058\u0307" }, - { "Xgr", L"\u039e" }, - { "Xgrave", L"\u0058\u0300" }, - { "Xi", L"\u039e" }, - { "Xmacr", L"\u0058\u0304" }, - { "Xtilde", L"\u0058\u0303" }, - { "Xuml", L"\u0058\u0308" }, - { "YAcy", L"\u042f" }, - { "YIcy", L"\u0407" }, - { "YUcy", L"\u042e" }, - { "Yacute", L"\u00dd" }, - { "Yacute", L"\u0059\u0301" }, - { "Ybreve", L"\u0059\u0306" }, - { "Ybring", L"\u0059\u032f" }, - { "Ycaron", L"\u0059\u030c" }, - { "Ycirc", L"\u0176" }, - { "Ycirc", L"\u0059\u0302" }, - { "Ycy", L"\u042b" }, - { "Ydot", L"\u0059\u0307" }, - { "Ygrave", L"\u0059\u0300" }, - { "Ymacr", L"\u0059\u0304" }, - { "Ytilde", L"\u0059\u0303" }, - { "Yuml", L"\u0178" }, - { "Yuml", L"\u0059\u0308" }, - { "ZHcy", L"\u0416" }, - { "Zacute", L"\u0179" }, - { "Zacute", L"\u005a\u0301" }, - { "Zbreve", L"\u005a\u0306" }, - { "Zbring", L"\u005a\u032f" }, - { "Zcaron", L"\u017d" }, - { "Zcaron", L"\u005a\u030c" }, - { "Zcirc", L"\u005a\u0302" }, - { "Zcy", L"\u0417" }, - { "Zdot", L"\u017b" }, - { "Zdot", L"\u005a\u0307" }, - { "Zeta", L"\u0396" }, - { "Zgr", L"\u0396" }, - { "Zgrave", L"\u005a\u0300" }, - { "Zmacr", L"\u005a\u0304" }, - { "Ztilde", L"\u005a\u0303" }, - { "Zuml", L"\u005a\u0308" }, - { "aacgr", L"\u03ac" }, - { "aacute", L"\u00e1" }, - { "aacute", L"\u0061\u0301" }, - { "abreve", L"\u0103" }, - { "abreve", L"\u0061\u0306" }, - { "abring", L"\u0061\u032f" }, - { "acaron", L"\u0061\u030c" }, - { "acirc", L"\u00e2" }, - { "acirc", L"\u0061\u0302" }, - { "acute", L"\u00b4" }, - { "acy", L"\u0430" }, - { "adot", L"\u0061\u0307" }, - { "aelig", L"\u00e6" }, - { "agr", L"\u03b1" }, - { "agrave", L"\u00e0" }, - { "agrave", L"\u0061\u0300" }, - { "alefsym", L"\u2135" }, - { "aleph", L"\u2135" }, - { "alpha", L"\u03b1" }, - { "amacr", L"\u0101" }, - { "amacr", L"\u0061\u0304" }, - { "amalg", L"\u2210" }, - { "amp", L"\u0026" }, - { "and", L"\u2227" }, - { "ang", L"\u2220" }, - { "ang90", L"\u221f" }, - { "angmsd", L"\u2221" }, - { "angsph", L"\u2222" }, - { "angst", L"\u212b" }, - { "aogon", L"\u0105" }, - { "ap", L"\u2248" }, - { "ape", L"\u224a" }, - { "apos", L"\u0027" }, - { "apos", L"\u02bc" }, - { "aring", L"\u00e5" }, - { "ast", L"\u002a" }, - { "asymp", L"\u2248" }, - { "atilde", L"\u00e3" }, - { "atilde", L"\u0061\u0303" }, - { "auml", L"\u00e4" }, - { "auml", L"\u0061\u0308" }, - { "b.Delta", L"\u0394" }, - { "b.Gamma", L"\u0393" }, - { "b.Lambda", L"\u039b" }, - { "b.Omega", L"\u03a9" }, - { "b.Phi", L"\u03a6" }, - { "b.Pi", L"\u03a0" }, - { "b.Psi", L"\u03a8" }, - { "b.Sigma", L"\u03a3" }, - { "b.Theta", L"\u0398" }, - { "b.Upsi", L"\u03a5" }, - { "b.Xi", L"\u039e" }, - { "b.alpha", L"\u03b1" }, - { "b.beta", L"\u03b2" }, - { "b.chi", L"\u03c7" }, - { "b.delta", L"\u03b4" }, - { "b.epsi", L"\u03b5" }, - { "b.epsis", L"\u03b5" }, - { "b.epsiv", L"\u03b5" }, - { "b.eta", L"\u03b7" }, - { "b.gamma", L"\u03b3" }, - { "b.gammad", L"\u03dc" }, - { "b.iota", L"\u03b9" }, - { "b.kappa", L"\u03ba" }, - { "b.kappav", L"\u03f0" }, - { "b.lambda", L"\u03bb" }, - { "b.mu", L"\u03bc" }, - { "b.nu", L"\u03bd" }, - { "b.omega", L"\u03ce" }, - { "b.phis", L"\u03c6" }, - { "b.phiv", L"\u03d5" }, - { "b.pi", L"\u03c0" }, - { "b.piv", L"\u03d6" }, - { "b.psi", L"\u03c8" }, - { "b.rho", L"\u03c1" }, - { "b.rhov", L"\u03f1" }, - { "b.sigma", L"\u03c3" }, - { "b.sigmav", L"\u03c2" }, - { "b.tau", L"\u03c4" }, - { "b.thetas", L"\u03b8" }, - { "b.thetav", L"\u03d1" }, - { "b.upsi", L"\u03c5" }, - { "b.xi", L"\u03be" }, - { "b.zeta", L"\u03b6" }, - { "bacute", L"\u0062\u0301" }, - { "barwed", L"\u22bc" }, - { "bbreve", L"\u0062\u0306" }, - { "bbring", L"\u0062\u032f" }, - { "bcaron", L"\u0062\u030c" }, - { "bcirc", L"\u0062\u0302" }, - { "bcong", L"\u224c" }, - { "bcy", L"\u0431" }, - { "bdot", L"\u0062\u0307" }, - { "bdquo", L"\u201e" }, - { "becaus", L"\u2235" }, - { "bepsi", L"\u220d" }, - { "bernou", L"\u212c" }, - { "beta", L"\u03b2" }, - { "beth", L"\u2136" }, - { "bgr", L"\u03b2" }, - { "bgrave", L"\u0062\u0300" }, - { "blank", L"\u2423" }, - { "blk12", L"\u2592" }, - { "blk14", L"\u2591" }, - { "blk34", L"\u2593" }, - { "block", L"\u2588" }, - { "bmacr", L"\u0062\u0304" }, - { "bottom", L"\u22a5" }, - { "bowtie", L"\u22c8" }, - { "boxDL", L"\u2557" }, - { "boxDR", L"\u2554" }, - { "boxDl", L"\u2556" }, - { "boxDr", L"\u2553" }, - { "boxH", L"\u2550" }, - { "boxHD", L"\u2566" }, - { "boxHU", L"\u2569" }, - { "boxHd", L"\u2564" }, - { "boxHu", L"\u2567" }, - { "boxUL", L"\u255d" }, - { "boxUR", L"\u255a" }, - { "boxUl", L"\u255c" }, - { "boxUr", L"\u2559" }, - { "boxV", L"\u2551" }, - { "boxVH", L"\u256c" }, - { "boxVL", L"\u2563" }, - { "boxVR", L"\u2560" }, - { "boxVh", L"\u256b" }, - { "boxVl", L"\u2562" }, - { "boxVr", L"\u255f" }, - { "boxdL", L"\u2555" }, - { "boxdR", L"\u2552" }, - { "boxdl", L"\u2510" }, - { "boxdr", L"\u250c" }, - { "boxh", L"\u2500" }, - { "boxhD", L"\u2565" }, - { "boxhU", L"\u2568" }, - { "boxhd", L"\u252c" }, - { "boxhu", L"\u2534" }, - { "boxuL", L"\u255b" }, - { "boxuR", L"\u2558" }, - { "boxul", L"\u2518" }, - { "boxur", L"\u2514" }, - { "boxv", L"\u2502" }, - { "boxvH", L"\u256a" }, - { "boxvL", L"\u2561" }, - { "boxvR", L"\u255e" }, - { "boxvh", L"\u253c" }, - { "boxvl", L"\u2524" }, - { "boxvr", L"\u251c" }, - { "bprime", L"\u2035" }, - { "breve", L"\u02d8" }, - { "brvbar", L"\u00a6" }, - { "bsim", L"\u223d" }, - { "bsime", L"\u22cd" }, - { "bsol", L"\u005c" }, - { "btilde", L"\u0062\u0303" }, - { "bull", L"\u2022" }, - { "buml", L"\u0062\u0308" }, - { "bump", L"\u224e" }, - { "bumpe", L"\u224f" }, - { "cacute", L"\u0107" }, - { "cacute", L"\u0063\u0301" }, - { "cap", L"\u2229" }, - { "caret", L"\u2041" }, - { "caron", L"\u02c7" }, - { "cbreve", L"\u0063\u0306" }, - { "cbring", L"\u0063\u032f" }, - { "ccaron", L"\u010d" }, - { "ccaron", L"\u0063\u030c" }, - { "ccedil", L"\u00e7" }, - { "ccirc", L"\u0109" }, - { "ccirc", L"\u0063\u0302" }, - { "cdot", L"\u010b" }, - { "cdot", L"\u0063\u0307" }, - { "cedil", L"\u00b8" }, - { "cent", L"\u00a2" }, - { "cgrave", L"\u0063\u0300" }, - { "chcy", L"\u0447" }, - { "check", L"\u2713" }, - { "chi", L"\u03c7" }, - { "cir", L"\u25cb" }, - { "circ", L"\u02c6" }, - { "circlef", L"\u25cf" }, - { "circlefb", L"\u25d2" }, - { "circlefl", L"\u25d0" }, - { "circlefr", L"\u25d1" }, - { "circleft", L"\u25d3" }, - { "cire", L"\u2257" }, - { "clubs", L"\u2663" }, - { "cmacr", L"\u0063\u0304" }, - { "colon", L"\u003a" }, - { "colone", L"\u2254" }, - { "comma", L"\u002c" }, - { "commat", L"\u0040" }, - { "comp", L"\u2201" }, - { "compfn", L"\u2218" }, - { "cong", L"\u2245" }, - { "conint", L"\u222e" }, - { "coprod", L"\u2210" }, - { "copy", L"\u00a9" }, - { "copysr", L"\u2117" }, - { "crarr", L"\u21b5" }, - { "cross", L"\u2717" }, - { "ctilde", L"\u0063\u0303" }, - { "cuepr", L"\u22de" }, - { "cuesc", L"\u22df" }, - { "cularr", L"\u21b6" }, - { "cuml", L"\u0063\u0308" }, - { "cup", L"\u222a" }, - { "cupre", L"\u227c" }, - { "curarr", L"\u21b7" }, - { "curren", L"\u00a4" }, - { "cuvee", L"\u22ce" }, - { "cuwed", L"\u22cf" }, - { "dArr", L"\u21d3" }, - { "dacute", L"\u0064\u0301" }, - { "dagger", L"\u2020" }, - { "daleth", L"\u2138" }, - { "darr", L"\u2193" }, - { "darr2", L"\u21ca" }, - { "dash", L"\u2010" }, - { "dashv", L"\u22a3" }, - { "dblac", L"\u02dd" }, - { "dbreve", L"\u0064\u0306" }, - { "dbring", L"\u0064\u032f" }, - { "dcaron", L"\u010f" }, - { "dcaron", L"\u0064\u030c" }, - { "dcirc", L"\u0064\u0302" }, - { "dcy", L"\u0434" }, - { "ddot", L"\u0064\u0307" }, - { "deg", L"\u00b0" }, - { "delta", L"\u03b4" }, - { "dgr", L"\u03b4" }, - { "dgrave", L"\u0064\u0300" }, - { "dharl", L"\u21c3" }, - { "dharr", L"\u21c2" }, - { "diam", L"\u22c4" }, - { "diamondf", L"\u25c6" }, - { "diams", L"\u2666" }, - { "die", L"\u00a8" }, - { "divide", L"\u00f7" }, - { "divonx", L"\u22c7" }, - { "djcy", L"\u0452" }, - { "dlarr", L"\u2199" }, - { "dlcorn", L"\u231e" }, - { "dlcrop", L"\u230d" }, - { "dmacr", L"\u0064\u0304" }, - { "dollar", L"\u0024" }, - { "dot", L"\u02d9" }, - { "drarr", L"\u2198" }, - { "drcorn", L"\u231f" }, - { "drcrop", L"\u230c" }, - { "dscy", L"\u0455" }, - { "dstrok", L"\u0111" }, - { "dtilde", L"\u0064\u0303" }, - { "dtri", L"\u25bf" }, - { "dtrif", L"\u25be" }, - { "duml", L"\u0064\u0308" }, - { "dzcy", L"\u045f" }, - { "eDot", L"\u2251" }, - { "eacgr", L"\u03ad" }, - { "eacute", L"\u00e9" }, - { "eacute", L"\u0065\u0301" }, - { "ebreve", L"\u0065\u0306" }, - { "ebring", L"\u0065\u032f" }, - { "ecaron", L"\u011b" }, - { "ecaron", L"\u0065\u030c" }, - { "ecir", L"\u2256" }, - { "ecirc", L"\u00ea" }, - { "ecirc", L"\u0065\u0302" }, - { "ecolon", L"\u2255" }, - { "ecy", L"\u044d" }, - { "edot", L"\u0117" }, - { "edot", L"\u0065\u0307" }, - { "edotb", L"\u1eb9" }, - { "eeacgr", L"\u03ae" }, - { "eegr", L"\u03b7" }, - { "efDot", L"\u2252" }, - { "egr", L"\u03b5" }, - { "egrave", L"\u00e8" }, - { "egrave", L"\u0065\u0300" }, - { "egs", L"\u22dd" }, - { "ell", L"\u2113" }, - { "els", L"\u22dc" }, - { "emacr", L"\u0113" }, - { "emacr", L"\u0065\u0304" }, - { "empty", L"\u2205" }, - { "emsp", L"\u2003" }, - { "emsp13", L"\u2004" }, - { "emsp14", L"\u2005" }, - { "eng", L"\u014b" }, - { "ensp", L"\u2002" }, - { "eogon", L"\u0119" }, - { "epsi", L"\u03b5" }, - { "epsilon", L"\u03b5" }, - { "epsis", L"\u220a" }, - { "equals", L"\u003d" }, - { "equiv", L"\u2261" }, - { "erDot", L"\u2253" }, - { "esdot", L"\u2250" }, - { "eta", L"\u03b7" }, - { "eth", L"\u00f0" }, - { "etilde", L"\u0065\u0303" }, - { "euml", L"\u00eb" }, - { "euml", L"\u0065\u0308" }, - { "euro", L"\u20ac" }, - { "excl", L"\u0021" }, - { "exist", L"\u2203" }, - { "facute", L"\u0066\u0301" }, - { "fbreve", L"\u0066\u0306" }, - { "fbring", L"\u0066\u032f" }, - { "fcaron", L"\u0066\u030c" }, - { "fcirc", L"\u0066\u0302" }, - { "fcy", L"\u0444" }, - { "fdot", L"\u0066\u0307" }, - { "female", L"\u2640" }, - { "ffilig", L"\ufb03" }, - { "fflig", L"\ufb00" }, - { "ffllig", L"\ufb04" }, - { "fgrave", L"\u0066\u0300" }, - { "filig", L"\ufb01" }, - { "flat", L"\u266d" }, - { "fllig", L"\ufb02" }, - { "fmacr", L"\u0066\u0304" }, - { "fnof", L"\u0192" }, - { "forall", L"\u2200" }, - { "fork", L"\u22d4" }, - { "frac12", L"\u00bd" }, - { "frac13", L"\u2153" }, - { "frac14", L"\u00bc" }, - { "frac15", L"\u2155" }, - { "frac16", L"\u2159" }, - { "frac18", L"\u215b" }, - { "frac23", L"\u2154" }, - { "frac25", L"\u2156" }, - { "frac34", L"\u00be" }, - { "frac35", L"\u2157" }, - { "frac38", L"\u215c" }, - { "frac45", L"\u2158" }, - { "frac56", L"\u215a" }, - { "frac58", L"\u215d" }, - { "frac78", L"\u215e" }, - { "frasl", L"\u2044" }, - { "frown", L"\u2322" }, - { "ftilde", L"\u0066\u0303" }, - { "fuml", L"\u0066\u0308" }, - { "gE", L"\u2267" }, - { "gacute", L"\u01f5" }, - { "gacute", L"\u0067\u0301" }, - { "gamma", L"\u03b3" }, - { "gammad", L"\u03dc" }, - { "gbreve", L"\u011f" }, - { "gbreve", L"\u0067\u0306" }, - { "gbring", L"\u0067\u032f" }, - { "gcaron", L"\u0067\u030c" }, - { "gcedil", L"\u0123" }, - { "gcirc", L"\u011d" }, - { "gcirc", L"\u0067\u0302" }, - { "gcy", L"\u0433" }, - { "gdot", L"\u0121" }, - { "gdot", L"\u0067\u0307" }, - { "ge", L"\u2265" }, - { "gel", L"\u22db" }, - { "ges", L"\u2265" }, - { "ggr", L"\u03b3" }, - { "ggrave", L"\u0067\u0300" }, - { "gimel", L"\u2137" }, - { "gjcy", L"\u0453" }, - { "gl", L"\u2277" }, - { "gmacr", L"\u0067\u0304" }, - { "gnE", L"\u2269" }, - { "gne", L"\u2269" }, - { "gnsim", L"\u22e7" }, - { "grave", L"\u0060" }, - { "gsdot", L"\u22d7" }, - { "gsim", L"\u2273" }, - { "gt", L"\u003e" }, - { "gtilde", L"\u0067\u0303" }, - { "guml", L"\u0067\u0308" }, - { "gvnE", L"\u2269" }, - { "hArr", L"\u21d4" }, - { "hacute", L"\u0068\u0301" }, - { "hairsp", L"\u200a" }, - { "half", L"\u00bd" }, - { "hamilt", L"\u210b" }, - { "hardcy", L"\u044a" }, - { "harr", L"\u2194" }, - { "harrw", L"\u21ad" }, - { "hbreve", L"\u0068\u0306" }, - { "hbring", L"\u0068\u032f" }, - { "hcaron", L"\u0068\u030c" }, - { "hcirc", L"\u0125" }, - { "hcirc", L"\u0068\u0302" }, - { "hdot", L"\u0068\u0307" }, - { "hearts", L"\u2665" }, - { "hellip", L"\u2026" }, - { "hgrave", L"\u0068\u0300" }, - { "hmacr", L"\u0068\u0304" }, - { "horbar", L"\u2015" }, - { "hstrok", L"\u0127" }, - { "htilde", L"\u0068\u0303" }, - { "huml", L"\u0068\u0308" }, - { "hybull", L"\u2043" }, - { "hyphen", L"\u002d" }, - { "iacgr", L"\u03af" }, - { "iacute", L"\u00ed" }, - { "iacute", L"\u0069\u0301" }, - { "ibreve", L"\u0069\u0306" }, - { "ibring", L"\u0069\u032f" }, - { "icaron", L"\u0069\u030c" }, - { "icirc", L"\u00ee" }, - { "icirc", L"\u0069\u0302" }, - { "icy", L"\u0438" }, - { "idiagr", L"\u0390" }, - { "idigr", L"\u03ca" }, - { "idot", L"\u0069\u0307" }, - { "iecy", L"\u0435" }, - { "iexcl", L"\u00a1" }, - { "iff", L"\u21d4" }, - { "igr", L"\u03b9" }, - { "igrave", L"\u00ec" }, - { "igrave", L"\u0069\u0300" }, - { "ijlig", L"\u0133" }, - { "imacr", L"\u012b" }, - { "imacr", L"\u0069\u0304" }, - { "image", L"\u2111" }, - { "incare", L"\u2105" }, - { "infin", L"\u221e" }, - { "inodot", L"\u0131" }, - { "inodot", L"\u0131" }, - { "int", L"\u222b" }, - { "intcal", L"\u22ba" }, - { "iocy", L"\u0451" }, - { "iogon", L"\u012f" }, - { "iota", L"\u03b9" }, - { "iquest", L"\u00bf" }, - { "isin", L"\u2208" }, - { "itilde", L"\u0129" }, - { "itilde", L"\u0069\u0303" }, - { "iukcy", L"\u0456" }, - { "iuml", L"\u00ef" }, - { "iuml", L"\u0069\u0308" }, - { "jacute", L"\u006a\u0301" }, - { "jbreve", L"\u006a\u0306" }, - { "jbring", L"\u006a\u032f" }, - { "jcaron", L"\u006a\u030c" }, - { "jcirc", L"\u0135" }, - { "jcirc", L"\u006a\u0302" }, - { "jcy", L"\u0439" }, - { "jdot", L"\u006a\u0307" }, - { "jgrave", L"\u006a\u0300" }, - { "jmacr", L"\u006a\u0304" }, - { "jsercy", L"\u0458" }, - { "jtilde", L"\u006a\u0303" }, - { "jukcy", L"\u0454" }, - { "juml", L"\u006a\u0308" }, - { "kacute", L"\u006b\u0301" }, - { "kappa", L"\u03ba" }, - { "kappav", L"\u03f0" }, - { "kbreve", L"\u006b\u0306" }, - { "kbring", L"\u006b\u032f" }, - { "kcaron", L"\u006b\u030c" }, - { "kcedil", L"\u0137" }, - { "kcirc", L"\u006b\u0302" }, - { "kcy", L"\u043a" }, - { "kdot", L"\u006b\u0307" }, - { "kgr", L"\u03ba" }, - { "kgrave", L"\u006b\u0300" }, - { "kgreen", L"\u0138" }, - { "khcy", L"\u0445" }, - { "khgr", L"\u03c7" }, - { "kjcy", L"\u045c" }, - { "kmacr", L"\u006b\u0304" }, - { "ktilde", L"\u006b\u0303" }, - { "kuml", L"\u006b\u0308" }, - { "lAarr", L"\u21da" }, - { "lArr", L"\u21d0" }, - { "lE", L"\u2266" }, - { "lacute", L"\u013a" }, - { "lacute", L"\u006c\u0301" }, - { "lagran", L"\u2112" }, - { "lambda", L"\u03bb" }, - { "lang", L"\u2329" }, - { "laquo", L"\u00ab" }, - { "larr", L"\u2190" }, - { "larr2", L"\u21c7" }, - { "larrhk", L"\u21a9" }, - { "larrlp", L"\u21ab" }, - { "larrtl", L"\u21a2" }, - { "lbreve", L"\u006c\u0306" }, - { "lbring", L"\u006c\u032f" }, - { "lcaron", L"\u013e" }, - { "lcaron", L"\u006c\u030c" }, - { "lcedil", L"\u013c" }, - { "lceil", L"\u2308" }, - { "lcirc", L"\u006c\u0302" }, - { "lcub", L"\u007b" }, - { "lcy", L"\u043b" }, - { "ldot", L"\u22d6" }, - { "ldot", L"\u006c\u0307" }, - { "ldquo", L"\u201c" }, - { "ldquor", L"\u201e" }, - { "le", L"\u2264" }, - { "leg", L"\u22da" }, - { "les", L"\u2264" }, - { "lfloor", L"\u230a" }, - { "lg", L"\u2276" }, - { "lgr", L"\u03bb" }, - { "lgrave", L"\u006c\u0300" }, - { "lhard", L"\u21bd" }, - { "lharu", L"\u21bc" }, - { "lhblk", L"\u2584" }, - { "ljcy", L"\u0459" }, - { "lmacr", L"\u006c\u0304" }, - { "lmidot", L"\u0140" }, - { "lnE", L"\u2268" }, - { "lne", L"\u2268" }, - { "lnsim", L"\u22e6" }, - { "lowast", L"\u2217" }, - { "lowbar", L"\u005f" }, - { "loz", L"\u25ca" }, - { "loz", L"\u2727" }, - { "lozf", L"\u2726" }, - { "lpar", L"\u0028" }, - { "lrarr2", L"\u21c6" }, - { "lrhar2", L"\u21cb" }, - { "lrm", L"\u200e" }, - { "lsaquo", L"\u2039" }, - { "lsh", L"\u21b0" }, - { "lsim", L"\u2272" }, - { "lsqb", L"\u005b" }, - { "lsquo", L"\u2018" }, - { "lsquor", L"\u201a" }, - { "lstrok", L"\u0142" }, - { "lt", L"\u003c" }, - { "lthree", L"\u22cb" }, - { "ltilde", L"\u006c\u0303" }, - { "ltimes", L"\u22c9" }, - { "ltri", L"\u25c3" }, - { "ltrie", L"\u22b4" }, - { "ltrif", L"\u25c2" }, - { "luml", L"\u006c\u0308" }, - { "lvnE", L"\u2268" }, - { "macr", L"\u00af" }, - { "macute", L"\u006d\u0301" }, - { "male", L"\u2642" }, - { "malt", L"\u2720" }, - { "map", L"\u21a6" }, - { "marker", L"\u25ae" }, - { "mbreve", L"\u006d\u0306" }, - { "mbring", L"\u006d\u032f" }, - { "mcaron", L"\u006d\u030c" }, - { "mcirc", L"\u006d\u0302" }, - { "mcy", L"\u043c" }, - { "mdash", L"\u2014" }, - { "mdot", L"\u006d\u0307" }, - { "mgr", L"\u03bc" }, - { "mgrave", L"\u006d\u0300" }, - { "micro", L"\u00b5" }, - { "mid", L"\u2223" }, - { "middot", L"\u00b7" }, - { "minus", L"\u2212" }, - { "minusb", L"\u229f" }, - { "mldr", L"\u2026" }, - { "mmacr", L"\u006d\u0304" }, - { "mnplus", L"\u2213" }, - { "models", L"\u22a7" }, - { "mtilde", L"\u006d\u0303" }, - { "mu", L"\u03bc" }, - { "mumap", L"\u22b8" }, - { "muml", L"\u006d\u0308" }, - { "nVDash", L"\u22af" }, - { "nVdash", L"\u22ae" }, - { "nabla", L"\u2207" }, - { "nacute", L"\u0144" }, - { "nacute", L"\u006e\u0301" }, - { "nap", L"\u2249" }, - { "napos", L"\u0149" }, - { "natur", L"\u266e" }, - { "nbreve", L"\u006e\u0306" }, - { "nbring", L"\u006e\u032f" }, - { "nbsp", L"\u00a0" }, - { "ncaron", L"\u0148" }, - { "ncaron", L"\u006e\u030c" }, - { "ncedil", L"\u0146" }, - { "ncirc", L"\u006e\u0302" }, - { "ncong", L"\u2247" }, - { "ncy", L"\u043d" }, - { "ndash", L"\u2013" }, - { "ndot", L"\u006e\u0307" }, - { "ne", L"\u2260" }, - { "nearr", L"\u2197" }, - { "nequiv", L"\u2262" }, - { "nexist", L"\u2204" }, - { "nge", L"\u2271" }, - { "nges", L"\u2271" }, - { "ngr", L"\u03bd" }, - { "ngrave", L"\u006e\u0300" }, - { "ngt", L"\u226f" }, - { "nhArr", L"\u21ce" }, - { "nharr", L"\u21ae" }, - { "ni", L"\u220b" }, - { "njcy", L"\u045a" }, - { "nlArr", L"\u21cd" }, - { "nlarr", L"\u219a" }, - { "nldr", L"\u2025" }, - { "nle", L"\u2270" }, - { "nles", L"\u2270" }, - { "nlt", L"\u226e" }, - { "nltri", L"\u22ea" }, - { "nltrie", L"\u22ec" }, - { "nmacr", L"\u006e\u0304" }, - { "nmid", L"\u2224" }, - { "not", L"\u00ac" }, - { "notin", L"\u2209" }, - { "npar", L"\u2226" }, - { "npr", L"\u2280" }, - { "npre", L"\u22e0" }, - { "nrArr", L"\u21cf" }, - { "nrarr", L"\u219b" }, - { "nrtri", L"\u22eb" }, - { "nrtrie", L"\u22ed" }, - { "nsc", L"\u2281" }, - { "nsce", L"\u22e1" }, - { "nsim", L"\u2241" }, - { "nsime", L"\u2244" }, - { "nspar", L"\u2226" }, - { "nsub", L"\u2284" }, - { "nsubE", L"\u2288" }, - { "nsube", L"\u2288" }, - { "nsup", L"\u2285" }, - { "nsupE", L"\u2289" }, - { "nsupe", L"\u2289" }, - { "ntilde", L"\u00f1" }, - { "ntilde", L"\u006e\u0303" }, - { "nu", L"\u03bd" }, - { "num", L"\u0023" }, - { "numero", L"\u2116" }, - { "numl", L"\u006e\u0308" }, - { "numsp", L"\u2007" }, - { "nvDash", L"\u22ad" }, - { "nvdash", L"\u22ac" }, - { "nwarr", L"\u2196" }, - { "oS", L"\u24c8" }, - { "oacgr", L"\u03cc" }, - { "oacute", L"\u00f3" }, - { "oacute", L"\u006f\u0301" }, - { "oast", L"\u229b" }, - { "obreve", L"\u006f\u0306" }, - { "obring", L"\u006f\u032f" }, - { "ocaron", L"\u01d2" }, - { "ocaron", L"\u006f\u030c" }, - { "ocir", L"\u229a" }, - { "ocirc", L"\u00f4" }, - { "ocirc", L"\u006f\u0302" }, - { "ocy", L"\u043e" }, - { "odash", L"\u229d" }, - { "odblac", L"\u0151" }, - { "odot", L"\u2299" }, - { "odot", L"\u006f\u0307" }, - { "odotb", L"\u1ecd" }, - { "oelig", L"\u0153" }, - { "ogon", L"\u02db" }, - { "ogr", L"\u03bf" }, - { "ograve", L"\u00f2" }, - { "ograve", L"\u006f\u0300" }, - { "ohacgr", L"\u03ce" }, - { "ohgr", L"\u03c9" }, - { "ohm", L"\u2126" }, - { "olarr", L"\u21ba" }, - { "oline", L"\u203e" }, - { "omacr", L"\u014d" }, - { "omacr", L"\u006f\u0304" }, - { "omega", L"\u03c9" }, - { "omicron", L"\u03bf" }, - { "ominus", L"\u2296" }, - { "oplus", L"\u2295" }, - { "or", L"\u2228" }, - { "orarr", L"\u21bb" }, - { "order", L"\u2134" }, - { "ordf", L"\u00aa" }, - { "ordm", L"\u00ba" }, - { "oslash", L"\u00f8" }, - { "osol", L"\u2298" }, - { "otilde", L"\u00f5" }, - { "otilde", L"\u006f\u0303" }, - { "otimes", L"\u2297" }, - { "ouml", L"\u00f6" }, - { "ouml", L"\u006f\u0308" }, - { "pacute", L"\u0070\u0301" }, - { "page", L"\u000c" }, - { "par", L"\u2225" }, - { "para", L"\u00b6" }, - { "part", L"\u2202" }, - { "pbreve", L"\u0070\u0306" }, - { "pbring", L"\u0070\u032f" }, - { "pcaron", L"\u0070\u030c" }, - { "pcirc", L"\u0070\u0302" }, - { "pcy", L"\u043f" }, - { "pdot", L"\u0070\u0307" }, - { "percnt", L"\u0025" }, - { "period", L"\u002e" }, - { "permil", L"\u2030" }, - { "perp", L"\u22a5" }, - { "pgr", L"\u03c0" }, - { "pgrave", L"\u0070\u0300" }, - { "phgr", L"\u03c6" }, - { "phi", L"\u03c6" }, - { "phis", L"\u03c6" }, - { "phiv", L"\u03d5" }, - { "phmmat", L"\u2133" }, - { "phone", L"\u260e" }, - { "pi", L"\u03c0" }, - { "piv", L"\u03d6" }, - { "planck", L"\u210f" }, - { "plus", L"\u002b" }, - { "plusb", L"\u229e" }, - { "plusdo", L"\u2214" }, - { "plusmn", L"\u00b1" }, - { "pmacr", L"\u0070\u0304" }, - { "pound", L"\u00a3" }, - { "pr", L"\u227a" }, - { "pre", L"\u227c" }, - { "prime", L"\u2032" }, - { "prnsim", L"\u22e8" }, - { "prod", L"\u220f" }, - { "prop", L"\u221d" }, - { "prsim", L"\u227e" }, - { "psgr", L"\u03c8" }, - { "psi", L"\u03c8" }, - { "ptilde", L"\u0070\u0303" }, - { "puml", L"\u0070\u0308" }, - { "puncsp", L"\u2008" }, - { "qacute", L"\u0071\u0301" }, - { "qbreve", L"\u0071\u0306" }, - { "qbring", L"\u0071\u032f" }, - { "qcaron", L"\u0071\u030c" }, - { "qcirc", L"\u0071\u0302" }, - { "qdot", L"\u0071\u0307" }, - { "qgrave", L"\u0071\u0300" }, - { "qmacr", L"\u0071\u0304" }, - { "qtilde", L"\u0071\u0303" }, - { "quest", L"\u003f" }, - { "quml", L"\u0071\u0308" }, - { "quot", L"\u0022" }, - { "rAarr", L"\u21db" }, - { "rArr", L"\u21d2" }, - { "racute", L"\u0155" }, - { "racute", L"\u0072\u0301" }, - { "radic", L"\u221a" }, - { "rang", L"\u232a" }, - { "raquo", L"\u00bb" }, - { "rarr", L"\u2192" }, - { "rarr2", L"\u21c9" }, - { "rarrhk", L"\u21aa" }, - { "rarrlp", L"\u21ac" }, - { "rarrtl", L"\u21a3" }, - { "rarrw", L"\u219d" }, - { "rbreve", L"\u0072\u0306" }, - { "rbring", L"\u0072\u032f" }, - { "rcaron", L"\u0159" }, - { "rcaron", L"\u0072\u030c" }, - { "rcedil", L"\u0157" }, - { "rceil", L"\u2309" }, - { "rcirc", L"\u0072\u0302" }, - { "rcub", L"\u007d" }, - { "rcy", L"\u0440" }, - { "rdot", L"\u0072\u0307" }, - { "rdquo", L"\u201d" }, - { "rdquor", L"\u201c" }, - { "real", L"\u211c" }, - { "rect", L"\u25ad" }, - { "reg", L"\u00ae" }, - { "rfloor", L"\u230b" }, - { "rgr", L"\u03c1" }, - { "rgrave", L"\u0072\u0300" }, - { "rhard", L"\u21c1" }, - { "rharu", L"\u21c0" }, - { "rho", L"\u03c1" }, - { "rhov", L"\u03f1" }, - { "ring", L"\u02da" }, - { "rlarr2", L"\u21c4" }, - { "rlhar2", L"\u21cc" }, - { "rlm", L"\u200f" }, - { "rmacr", L"\u0072\u0304" }, - { "rpar", L"\u0029" }, - { "rsaquo", L"\u203a" }, - { "rsh", L"\u21b1" }, - { "rsqb", L"\u005d" }, - { "rsquo", L"\u2019" }, - { "rsquor", L"\u2018" }, - { "rthree", L"\u22cc" }, - { "rtilde", L"\u0072\u0303" }, - { "rtimes", L"\u22ca" }, - { "rtri", L"\u25b9" }, - { "rtrie", L"\u22b5" }, - { "rtrif", L"\u25b8" }, - { "ruml", L"\u0072\u0308" }, - { "rx", L"\u211e" }, - { "sacute", L"\u015b" }, - { "sacute", L"\u0073\u0301" }, - { "samalg", L"\u2210" }, - { "sbquo", L"\u201a" }, - { "sbreve", L"\u0073\u0306" }, - { "sbring", L"\u0073\u032f" }, - { "sbsol", L"\u005c" }, - { "sc", L"\u227b" }, - { "scaron", L"\u0161" }, - { "scaron", L"\u0073\u030c" }, - { "sccue", L"\u227d" }, - { "sce", L"\u227d" }, - { "scedil", L"\u015f" }, - { "schwa", L"\u0259" }, - { "schwaacute", L"\u0259\u0301" }, - { "schwadgrave", L"\u0259\u030f" }, - { "schwagrave", L"\u0259\u0300" }, - { "schwamacr", L"\u0259\u0304" }, - { "scirc", L"\u015d" }, - { "scirc", L"\u0073\u0302" }, - { "scnsim", L"\u22e9" }, - { "scsim", L"\u227f" }, - { "scy", L"\u0441" }, - { "sdot", L"\u22c5" }, - { "sdot", L"\u0073\u0307" }, - { "sdotb", L"\u22a1" }, - { "sect", L"\u00a7" }, - { "semi", L"\u003b" }, - { "setmn", L"\u2216" }, - { "sext", L"\u2736" }, - { "sfgr", L"\u03c2" }, - { "sfrown", L"\u2322" }, - { "sgr", L"\u03c3" }, - { "sgrave", L"\u0073\u0300" }, - { "sharp", L"\u266f" }, - { "shchcy", L"\u0449" }, - { "shcy", L"\u0448" }, - { "shy", L"\u00ad" }, - { "sigma", L"\u03c3" }, - { "sigmaf", L"\u03c2" }, - { "sigmav", L"\u03c2" }, - { "sim", L"\u223c" }, - { "sime", L"\u2243" }, - { "smacr", L"\u0073\u0304" }, - { "smile", L"\u2323" }, - { "softcy", L"\u044c" }, - { "sol", L"\u002f" }, - { "spades", L"\u2660" }, - { "spar", L"\u2225" }, - { "sqcap", L"\u2293" }, - { "sqcup", L"\u2294" }, - { "sqsub", L"\u228f" }, - { "sqsube", L"\u2291" }, - { "sqsup", L"\u2290" }, - { "sqsupe", L"\u2292" }, - { "squ", L"\u25a1" }, - { "square", L"\u25a1" }, - { "squarf", L"\u25a0" }, - { "squf", L"\u25aa" }, - { "ssetmn", L"\u2216" }, - { "ssmile", L"\u2323" }, - { "sstarf", L"\u22c6" }, - { "star", L"\u2606" }, - { "starf", L"\u2605" }, - { "stilde", L"\u0073\u0303" }, - { "sub", L"\u2282" }, - { "subE", L"\u2286" }, - { "sube", L"\u2286" }, - { "subnE", L"\u228a" }, - { "subne", L"\u228a" }, - { "sum", L"\u2211" }, - { "suml", L"\u0073\u0308" }, - { "sung", L"\u266a" }, - { "sup", L"\u2283" }, - { "sup1", L"\u00b9" }, - { "sup2", L"\u00b2" }, - { "sup3", L"\u00b3" }, - { "supE", L"\u2287" }, - { "supe", L"\u2287" }, - { "supnE", L"\u228b" }, - { "supne", L"\u228b" }, - { "szlig", L"\u00df" }, - { "tacute", L"\u0074\u0301" }, - { "target", L"\u2316" }, - { "tau", L"\u03c4" }, - { "tbreve", L"\u0074\u0306" }, - { "tbring", L"\u0074\u032f" }, - { "tcaron", L"\u0165" }, - { "tcaron", L"\u0074\u030c" }, - { "tcedil", L"\u0163" }, - { "tcirc", L"\u0074\u0302" }, - { "tcy", L"\u0442" }, - { "tdot", L"\u20db" }, - { "tdot", L"\u0074\u0307" }, - { "telrec", L"\u2315" }, - { "tgr", L"\u03c4" }, - { "tgrave", L"\u0074\u0300" }, - { "there4", L"\u2234" }, - { "theta", L"\u03b8" }, - { "thetas", L"\u03b8" }, - { "thetasym", L"\u03d1" }, - { "thetav", L"\u03d1" }, - { "thgr", L"\u03b8" }, - { "thinsp", L"\u2009" }, - { "thkap", L"\u2248" }, - { "thksim", L"\u223c" }, - { "thorn", L"\u00fe" }, - { "tilde", L"\u02dc" }, - { "times", L"\u00d7" }, - { "timesb", L"\u22a0" }, - { "tmacr", L"\u0074\u0304" }, - { "top", L"\u22a4" }, - { "tprime", L"\u2034" }, - { "trade", L"\u2122" }, - { "trie", L"\u225c" }, - { "tscy", L"\u0446" }, - { "tshcy", L"\u045b" }, - { "tstrok", L"\u0167" }, - { "ttilde", L"\u0074\u0303" }, - { "tuml", L"\u0074\u0308" }, - { "twixt", L"\u226c" }, - { "uArr", L"\u21d1" }, - { "uacgr", L"\u03cd" }, - { "uacute", L"\u00fa" }, - { "uacute", L"\u0075\u0301" }, - { "uarr", L"\u2191" }, - { "uarr2", L"\u21c8" }, - { "ubrcy", L"\u045e" }, - { "ubreve", L"\u016d" }, - { "ubreve", L"\u0075\u0306" }, - { "ubring", L"\u0075\u032f" }, - { "ucaron", L"\u0075\u030c" }, - { "ucirc", L"\u00fb" }, - { "ucirc", L"\u0075\u0302" }, - { "ucy", L"\u0443" }, - { "udblac", L"\u0171" }, - { "udiagr", L"\u03b0" }, - { "udigr", L"\u03cb" }, - { "udot", L"\u0075\u0307" }, - { "ugr", L"\u03c5" }, - { "ugrave", L"\u00f9" }, - { "ugrave", L"\u0075\u0300" }, - { "uharl", L"\u21bf" }, - { "uharr", L"\u21be" }, - { "uhblk", L"\u2580" }, - { "ulcorn", L"\u231c" }, - { "ulcrop", L"\u230f" }, - { "umacr", L"\u016b" }, - { "umacr", L"\u0075\u0304" }, - { "uml", L"\u00a8" }, - { "uogon", L"\u0173" }, - { "uplus", L"\u228e" }, - { "upsi", L"\u03c5" }, - { "upsih", L"\u03d2" }, - { "upsilon", L"\u03c5" }, - { "urcorn", L"\u231d" }, - { "urcrop", L"\u230e" }, - { "uring", L"\u016f" }, - { "utilde", L"\u0169" }, - { "utilde", L"\u0075\u0303" }, - { "utri", L"\u25b5" }, - { "utrif", L"\u25b4" }, - { "uuml", L"\u00fc" }, - { "uuml", L"\u0075\u0308" }, - { "vArr", L"\u21d5" }, - { "vDash", L"\u22a8" }, - { "vacute", L"\u0076\u0301" }, - { "varr", L"\u2195" }, - { "vbreve", L"\u0076\u0306" }, - { "vbring", L"\u0076\u032f" }, - { "vcaron", L"\u0076\u030c" }, - { "vcirc", L"\u0076\u0302" }, - { "vcy", L"\u0432" }, - { "vdash", L"\u22a2" }, - { "vdot", L"\u0076\u0307" }, - { "veebar", L"\u22bb" }, - { "vellip", L"\u22ee" }, - { "verbar", L"\u007c" }, - { "vgrave", L"\u0076\u0300" }, - { "vltri", L"\u22b2" }, - { "vmacr", L"\u0076\u0304" }, - { "vprime", L"\u2032" }, - { "vprop", L"\u221d" }, - { "vrtri", L"\u22b3" }, - { "vsubnE", L"\u228a" }, - { "vsubne", L"\u228a" }, - { "vsupnE", L"\u228b" }, - { "vsupne", L"\u228b" }, - { "vtab", L"\u000b" }, - { "vtilde", L"\u0076\u0303" }, - { "vuml", L"\u0076\u0308" }, - { "wacute", L"\u0077\u0301" }, - { "wbreve", L"\u0077\u0306" }, - { "wbring", L"\u0077\u032f" }, - { "wcaron", L"\u0077\u030c" }, - { "wcirc", L"\u0175" }, - { "wcirc", L"\u0077\u0302" }, - { "wdot", L"\u0077\u0307" }, - { "wedgeq", L"\u2259" }, - { "weierp", L"\u2118" }, - { "wgrave", L"\u0077\u0300" }, - { "wmacr", L"\u0077\u0304" }, - { "wreath", L"\u2240" }, - { "wtilde", L"\u0077\u0303" }, - { "wuml", L"\u0077\u0308" }, - { "xacute", L"\u0078\u0301" }, - { "xbreve", L"\u0078\u0306" }, - { "xbring", L"\u0078\u032f" }, - { "xcaron", L"\u0078\u030c" }, - { "xcirc", L"\u25cb" }, - { "xcirc", L"\u0078\u0302" }, - { "xdot", L"\u0078\u0307" }, - { "xdtri", L"\u25bd" }, - { "xgr", L"\u03be" }, - { "xgrave", L"\u0078\u0300" }, - { "xhArr", L"\u2194" }, - { "xharr", L"\u2194" }, - { "xi", L"\u03be" }, - { "xlArr", L"\u21d0" }, - { "xmacr", L"\u0078\u0304" }, - { "xrArr", L"\u21d2" }, - { "xtilde", L"\u0078\u0303" }, - { "xuml", L"\u0078\u0308" }, - { "xutri", L"\u25b3" }, - { "yacute", L"\u00fd" }, - { "yacute", L"\u0079\u0301" }, - { "yacy", L"\u044f" }, - { "ybreve", L"\u0079\u0306" }, - { "ybring", L"\u0079\u032f" }, - { "ycaron", L"\u0079\u030c" }, - { "ycirc", L"\u0177" }, - { "ycirc", L"\u0079\u0302" }, - { "ycy", L"\u044b" }, - { "ydot", L"\u0079\u0307" }, - { "yen", L"\u00a5" }, - { "ygrave", L"\u0079\u0300" }, - { "yicy", L"\u0457" }, - { "ymacr", L"\u0079\u0304" }, - { "ytilde", L"\u0079\u0303" }, - { "yucy", L"\u044e" }, - { "yuml", L"\u00ff" }, - { "yuml", L"\u0079\u0308" }, - { "zacute", L"\u017a" }, - { "zacute", L"\u007a\u0301" }, - { "zbreve", L"\u007a\u0306" }, - { "zbring", L"\u007a\u032f" }, - { "zcaron", L"\u017e" }, - { "zcaron", L"\u007a\u030c" }, - { "zcirc", L"\u007a\u0302" }, - { "zcy", L"\u0437" }, - { "zdot", L"\u017c" }, - { "zdot", L"\u007a\u0307" }, - { "zeta", L"\u03b6" }, - { "zgr", L"\u03b6" }, - { "zgrave", L"\u007a\u0300" }, - { "zhcy", L"\u0436" }, - { "zmacr", L"\u007a\u0304" }, - { "ztilde", L"\u007a\u0303" }, - { "zuml", L"\u007a\u0308" }, - { "zwj", L"\u200d" }, - { "zwnj", L"\u200c" }, + { "AElig", U"\u00c6" }, + { "Aacgr", U"\u0386" }, + { "Aacute", U"\u00c1" }, + { "Aacute", U"\u0041\u0301" }, + { "Abreve", U"\u0102" }, + { "Abreve", U"\u0041\u0306" }, + { "Abring", U"\u0041\u032f" }, + { "Acaron", U"\u0041\u030c" }, + { "Acirc", U"\u00c2" }, + { "Acirc", U"\u0041\u0302" }, + { "Acy", U"\u0410" }, + { "Adot", U"\u0041\u0307" }, + { "Agr", U"\u0391" }, + { "Agrave", U"\u00c0" }, + { "Agrave", U"\u0041\u0300" }, + { "Alpha", U"\u0391" }, + { "Amacr", U"\u0100" }, + { "Amacr", U"\u0041\u0304" }, + { "Aogon", U"\u0104" }, + { "Aring", U"\u00c5" }, + { "Atilde", U"\u00c3" }, + { "Atilde", U"\u0041\u0303" }, + { "Auml", U"\u00c4" }, + { "Auml", U"\u0041\u0308" }, + { "Bacute", U"\u0042\u0301" }, + { "Barwed", U"\u2306" }, + { "Bbreve", U"\u0042\u0306" }, + { "Bbring", U"\u0042\u032f" }, + { "Bcaron", U"\u0042\u030c" }, + { "Bcirc", U"\u0042\u0302" }, + { "Bcy", U"\u0411" }, + { "Bdot", U"\u0042\u0307" }, + { "Beta", U"\u0392" }, + { "Bgr", U"\u0392" }, + { "Bgrave", U"\u0042\u0300" }, + { "Bmacr", U"\u0042\u0304" }, + { "Btilde", U"\u0042\u0303" }, + { "Buml", U"\u0042\u0308" }, + { "CHcy", U"\u0427" }, + { "Cacute", U"\u0106" }, + { "Cacute", U"\u0043\u0301" }, + { "Cap", U"\u22d2" }, + { "Cbreve", U"\u0043\u0306" }, + { "Cbring", U"\u0043\u032f" }, + { "Ccaron", U"\u010c" }, + { "Ccaron", U"\u0043\u030c" }, + { "Ccedil", U"\u00c7" }, + { "Ccirc", U"\u0108" }, + { "Ccirc", U"\u0043\u0302" }, + { "Cdot", U"\u010a" }, + { "Cdot", U"\u0043\u0307" }, + { "Cgrave", U"\u0043\u0300" }, + { "Chi", U"\u03a7" }, + { "Cmacr", U"\u0043\u0304" }, + { "Ctilde", U"\u0043\u0303" }, + { "Cuml", U"\u0043\u0308" }, + { "Cup", U"\u22d3" }, + { "DJcy", U"\u0402" }, + { "DScy", U"\u0405" }, + { "DZcy", U"\u040f" }, + { "Dacute", U"\u0044\u0301" }, + { "Dagger", U"\u2021" }, + { "Dbreve", U"\u0044\u0306" }, + { "Dbring", U"\u0044\u032f" }, + { "Dcaron", U"\u010e" }, + { "Dcaron", U"\u0044\u030c" }, + { "Dcirc", U"\u0044\u0302" }, + { "Dcy", U"\u0414" }, + { "Ddot", U"\u0044\u0307" }, + { "Delta", U"\u0394" }, + { "Dgr", U"\u0394" }, + { "Dgrave", U"\u0044\u0300" }, + { "Dmacr", U"\u0044\u0304" }, + { "Dot", U"\u00a8" }, + { "DotDot", U"\u20dc" }, + { "Dstrok", U"\u0110" }, + { "Dtilde", U"\u0044\u0303" }, + { "Duml", U"\u0044\u0308" }, + { "EEacgr", U"\u0389" }, + { "EEgr", U"\u0397" }, + { "ENG", U"\u014a" }, + { "ETH", U"\u00d0" }, + { "Eacgr", U"\u0388" }, + { "Eacute", U"\u00c9" }, + { "Eacute", U"\u0045\u0301" }, + { "Ebreve", U"\u0045\u0306" }, + { "Ebring", U"\u0045\u032f" }, + { "Ecaron", U"\u011a" }, + { "Ecaron", U"\u0045\u030c" }, + { "Ecirc", U"\u00ca" }, + { "Ecirc", U"\u0045\u0302" }, + { "Ecy", U"\u042d" }, + { "Edot", U"\u0116" }, + { "Edot", U"\u0045\u0307" }, + { "Edotb", U"\u1eb8" }, + { "Egr", U"\u0395" }, + { "Egrave", U"\u00c8" }, + { "Egrave", U"\u0045\u0300" }, + { "Emacr", U"\u0112" }, + { "Emacr", U"\u0045\u0304" }, + { "Eogon", U"\u0118" }, + { "Epsilon", U"\u0395" }, + { "Eta", U"\u0397" }, + { "Etilde", U"\u0045\u0303" }, + { "Euml", U"\u00cb" }, + { "Euml", U"\u0045\u0308" }, + { "Facute", U"\u0046\u0301" }, + { "Fbreve", U"\u0046\u0306" }, + { "Fbring", U"\u0046\u032f" }, + { "Fcaron", U"\u0046\u030c" }, + { "Fcirc", U"\u0046\u0302" }, + { "Fcy", U"\u0424" }, + { "Fdot", U"\u0046\u0307" }, + { "Fgrave", U"\u0046\u0300" }, + { "Fmacr", U"\u0046\u0304" }, + { "Ftilde", U"\u0046\u0303" }, + { "Fuml", U"\u0046\u0308" }, + { "GJcy", U"\u0403" }, + { "Gacute", U"\u0047\u0301" }, + { "Gamma", U"\u0393" }, + { "Gbreve", U"\u011e" }, + { "Gbreve", U"\u0047\u0306" }, + { "Gbring", U"\u0047\u032f" }, + { "Gcaron", U"\u0047\u030c" }, + { "Gcedil", U"\u0122" }, + { "Gcirc", U"\u011c" }, + { "Gcirc", U"\u0047\u0302" }, + { "Gcy", U"\u0413" }, + { "Gdot", U"\u0120" }, + { "Gdot", U"\u0047\u0307" }, + { "Gg", U"\u22d9" }, + { "Ggr", U"\u0393" }, + { "Ggrave", U"\u0047\u0300" }, + { "Gmacr", U"\u0047\u0304" }, + { "Gt", U"\u226b" }, + { "Gtilde", U"\u0047\u0303" }, + { "Guml", U"\u0047\u0308" }, + { "HARDcy", U"\u042a" }, + { "Hacute", U"\u0048\u0301" }, + { "Hbreve", U"\u0048\u0306" }, + { "Hbring", U"\u0048\u032f" }, + { "Hcaron", U"\u0048\u030c" }, + { "Hcirc", U"\u0124" }, + { "Hcirc", U"\u0048\u0302" }, + { "Hdot", U"\u0048\u0307" }, + { "Hgrave", U"\u0048\u0300" }, + { "Hmacr", U"\u0048\u0304" }, + { "Hstrok", U"\u0126" }, + { "Htilde", U"\u0048\u0303" }, + { "Huml", U"\u0048\u0308" }, + { "IEcy", U"\u0415" }, + { "IJlig", U"\u0132" }, + { "IOcy", U"\u0401" }, + { "Iacgr", U"\u038a" }, + { "Iacute", U"\u00cd" }, + { "Iacute", U"\u0049\u0301" }, + { "Ibreve", U"\u0049\u0306" }, + { "Ibring", U"\u0049\u032f" }, + { "Icaron", U"\u0049\u030c" }, + { "Icirc", U"\u00ce" }, + { "Icirc", U"\u0049\u0302" }, + { "Icy", U"\u0418" }, + { "Idigr", U"\u03aa" }, + { "Idot", U"\u0130" }, + { "Idot", U"\u0049\u0307" }, + { "Igr", U"\u0399" }, + { "Igrave", U"\u00cc" }, + { "Igrave", U"\u0049\u0300" }, + { "Imacr", U"\u012a" }, + { "Imacr", U"\u0049\u0304" }, + { "Iogon", U"\u012e" }, + { "Iota", U"\u0399" }, + { "Itilde", U"\u0128" }, + { "Itilde", U"\u0049\u0303" }, + { "Iukcy", U"\u0406" }, + { "Iuml", U"\u00cf" }, + { "Iuml", U"\u0049\u0308" }, + { "Jacute", U"\u004a\u0301" }, + { "Jbreve", U"\u004a\u0306" }, + { "Jbring", U"\u004a\u032f" }, + { "Jcaron", U"\u004a\u030c" }, + { "Jcirc", U"\u0134" }, + { "Jcirc", U"\u004a\u0302" }, + { "Jcy", U"\u0419" }, + { "Jdot", U"\u004a\u0307" }, + { "Jgrave", U"\u004a\u0300" }, + { "Jmacr", U"\u004a\u0304" }, + { "Jsercy", U"\u0408" }, + { "Jtilde", U"\u004a\u0303" }, + { "Jukcy", U"\u0404" }, + { "Juml", U"\u004a\u0308" }, + { "KHcy", U"\u0425" }, + { "KHgr", U"\u03a7" }, + { "KJcy", U"\u040c" }, + { "Kacute", U"\u004b\u0301" }, + { "Kappa", U"\u039a" }, + { "Kbreve", U"\u004b\u0306" }, + { "Kbring", U"\u004b\u032f" }, + { "Kcaron", U"\u004b\u030c" }, + { "Kcedil", U"\u0136" }, + { "Kcirc", U"\u004b\u0302" }, + { "Kcy", U"\u041a" }, + { "Kdot", U"\u004b\u0307" }, + { "Kgr", U"\u039a" }, + { "Kgrave", U"\u004b\u0300" }, + { "Kmacr", U"\u004b\u0304" }, + { "Ktilde", U"\u004b\u0303" }, + { "Kuml", U"\u004b\u0308" }, + { "LJcy", U"\u0409" }, + { "Lacute", U"\u0139" }, + { "Lacute", U"\u004c\u0301" }, + { "Lambda", U"\u039b" }, + { "Larr", U"\u219e" }, + { "Lbreve", U"\u004c\u0306" }, + { "Lbring", U"\u004c\u032f" }, + { "Lcaron", U"\u013d" }, + { "Lcaron", U"\u004c\u030c" }, + { "Lcedil", U"\u013b" }, + { "Lcirc", U"\u004c\u0302" }, + { "Lcy", U"\u041b" }, + { "Ldot", U"\u004c\u0307" }, + { "Lgr", U"\u039b" }, + { "Lgrave", U"\u004c\u0300" }, + { "Ll", U"\u22d8" }, + { "Lmacr", U"\u004c\u0304" }, + { "Lmidot", U"\u013f" }, + { "Lstrok", U"\u0141" }, + { "Lt", U"\u226a" }, + { "Ltilde", U"\u004c\u0303" }, + { "Luml", U"\u004c\u0308" }, + { "Macute", U"\u004d\u0301" }, + { "Mbreve", U"\u004d\u0306" }, + { "Mbring", U"\u004d\u032f" }, + { "Mcaron", U"\u004d\u030c" }, + { "Mcirc", U"\u004d\u0302" }, + { "Mcy", U"\u041c" }, + { "Mdot", U"\u004d\u0307" }, + { "Mgr", U"\u039c" }, + { "Mgrave", U"\u004d\u0300" }, + { "Mmacr", U"\u004d\u0304" }, + { "Mtilde", U"\u004d\u0303" }, + { "Mu", U"\u039c" }, + { "Muml", U"\u004d\u0308" }, + { "NJcy", U"\u040a" }, + { "Nacute", U"\u0143" }, + { "Nacute", U"\u004e\u0301" }, + { "Nbreve", U"\u004e\u0306" }, + { "Nbring", U"\u004e\u032f" }, + { "Ncaron", U"\u0147" }, + { "Ncaron", U"\u004e\u030c" }, + { "Ncedil", U"\u0145" }, + { "Ncirc", U"\u004e\u0302" }, + { "Ncy", U"\u041d" }, + { "Ndot", U"\u004e\u0307" }, + { "Ngr", U"\u039d" }, + { "Ngrave", U"\u004e\u0300" }, + { "Nmacr", U"\u004e\u0304" }, + { "Ntilde", U"\u00d1" }, + { "Ntilde", U"\u004e\u0303" }, + { "Nu", U"\u039d" }, + { "Numl", U"\u004e\u0308" }, + { "OElig", U"\u0152" }, + { "OHacgr", U"\u038f" }, + { "OHgr", U"\u03a9" }, + { "Oacgr", U"\u038c" }, + { "Oacute", U"\u00d3" }, + { "Oacute", U"\u004f\u0301" }, + { "Obreve", U"\u004f\u0306" }, + { "Obring", U"\u004f\u032f" }, + { "Ocaron", U"\u01d1" }, + { "Ocaron", U"\u004f\u030c" }, + { "Ocirc", U"\u00d4" }, + { "Ocirc", U"\u004f\u0302" }, + { "Ocy", U"\u041e" }, + { "Odblac", U"\u0150" }, + { "Odot", U"\u004f\u0307" }, + { "Odotb", U"\u1ecc" }, + { "Ogr", U"\u039f" }, + { "Ograve", U"\u00d2" }, + { "Ograve", U"\u004f\u0300" }, + { "Omacr", U"\u014c" }, + { "Omacr", U"\u004f\u0304" }, + { "Omega", U"\u03a9" }, + { "Omicron", U"\u039f" }, + { "Oslash", U"\u00d8" }, + { "Otilde", U"\u00d5" }, + { "Otilde", U"\u004f\u0303" }, + { "Ouml", U"\u00d6" }, + { "Ouml", U"\u004f\u0308" }, + { "PHgr", U"\u03a6" }, + { "PSgr", U"\u03a8" }, + { "Pacute", U"\u0050\u0301" }, + { "Pbreve", U"\u0050\u0306" }, + { "Pbring", U"\u0050\u032f" }, + { "Pcaron", U"\u0050\u030c" }, + { "Pcirc", U"\u0050\u0302" }, + { "Pcy", U"\u041f" }, + { "Pdot", U"\u0050\u0307" }, + { "Pgr", U"\u03a0" }, + { "Pgrave", U"\u0050\u0300" }, + { "Phi", U"\u03a6" }, + { "Pi", U"\u03a0" }, + { "Pmacr", U"\u0050\u0304" }, + { "Prime", U"\u2033" }, + { "Psi", U"\u03a8" }, + { "Ptilde", U"\u0050\u0303" }, + { "Puml", U"\u0050\u0308" }, + { "Qacute", U"\u0051\u0301" }, + { "Qbreve", U"\u0051\u0306" }, + { "Qbring", U"\u0051\u032f" }, + { "Qcaron", U"\u0051\u030c" }, + { "Qcirc", U"\u0051\u0302" }, + { "Qdot", U"\u0051\u0307" }, + { "Qgrave", U"\u0051\u0300" }, + { "Qmacr", U"\u0051\u0304" }, + { "Qtilde", U"\u0051\u0303" }, + { "Quml", U"\u0051\u0308" }, + { "Racute", U"\u0154" }, + { "Racute", U"\u0052\u0301" }, + { "Rarr", U"\u21a0" }, + { "Rbreve", U"\u0052\u0306" }, + { "Rbring", U"\u0052\u032f" }, + { "Rcaron", U"\u0158" }, + { "Rcaron", U"\u0052\u030c" }, + { "Rcedil", U"\u0156" }, + { "Rcirc", U"\u0052\u0302" }, + { "Rcy", U"\u0420" }, + { "Rdot", U"\u0052\u0307" }, + { "Rgr", U"\u03a1" }, + { "Rgrave", U"\u0052\u0300" }, + { "Rho", U"\u03a1" }, + { "Rmacr", U"\u0052\u0304" }, + { "Rtilde", U"\u0052\u0303" }, + { "Ruml", U"\u0052\u0308" }, + { "SHCHcy", U"\u0429" }, + { "SHcy", U"\u0428" }, + { "SOFTcy", U"\u042c" }, + { "Sacute", U"\u015a" }, + { "Sacute", U"\u0053\u0301" }, + { "Sbreve", U"\u0053\u0306" }, + { "Sbring", U"\u0053\u032f" }, + { "Scaron", U"\u0160" }, + { "Scaron", U"\u0053\u030c" }, + { "Scedil", U"\u015e" }, + { "Scirc", U"\u015c" }, + { "Scirc", U"\u0053\u0302" }, + { "Scy", U"\u0421" }, + { "Sdot", U"\u0053\u0307" }, + { "Sgr", U"\u03a3" }, + { "Sgrave", U"\u0053\u0300" }, + { "Sigma", U"\u03a3" }, + { "Smacr", U"\u0053\u0304" }, + { "Stilde", U"\u0053\u0303" }, + { "Sub", U"\u22d0" }, + { "Suml", U"\u0053\u0308" }, + { "Sup", U"\u22d1" }, + { "THORN", U"\u00de" }, + { "THgr", U"\u0398" }, + { "TSHcy", U"\u040b" }, + { "TScy", U"\u0426" }, + { "Tacute", U"\u0054\u0301" }, + { "Tau", U"\u03a4" }, + { "Tbreve", U"\u0054\u0306" }, + { "Tbring", U"\u0054\u032f" }, + { "Tcaron", U"\u0164" }, + { "Tcaron", U"\u0054\u030c" }, + { "Tcedil", U"\u0162" }, + { "Tcirc", U"\u0054\u0302" }, + { "Tcy", U"\u0422" }, + { "Tdot", U"\u0054\u0307" }, + { "Tgr", U"\u03a4" }, + { "Tgrave", U"\u0054\u0300" }, + { "Theta", U"\u0398" }, + { "Tmacr", U"\u0054\u0304" }, + { "Tstrok", U"\u0166" }, + { "Ttilde", U"\u0054\u0303" }, + { "Tuml", U"\u0054\u0308" }, + { "Uacgr", U"\u038e" }, + { "Uacute", U"\u00da" }, + { "Uacute", U"\u0055\u0301" }, + { "Ubrcy", U"\u040e" }, + { "Ubreve", U"\u016c" }, + { "Ubreve", U"\u0055\u0306" }, + { "Ubring", U"\u0055\u032f" }, + { "Ucaron", U"\u0055\u030c" }, + { "Ucirc", U"\u00db" }, + { "Ucirc", U"\u0055\u0302" }, + { "Ucy", U"\u0423" }, + { "Udblac", U"\u0170" }, + { "Udigr", U"\u03ab" }, + { "Udot", U"\u0055\u0307" }, + { "Ugr", U"\u03a5" }, + { "Ugrave", U"\u00d9" }, + { "Ugrave", U"\u0055\u0300" }, + { "Umacr", U"\u016a" }, + { "Umacr", U"\u0055\u0304" }, + { "Uogon", U"\u0172" }, + { "Upsi", U"\u03a5" }, + { "Upsilon", U"\u03a5" }, + { "Uring", U"\u016e" }, + { "Utilde", U"\u0168" }, + { "Utilde", U"\u0055\u0303" }, + { "Uuml", U"\u00dc" }, + { "Uuml", U"\u0055\u0308" }, + { "Vacute", U"\u0056\u0301" }, + { "Vbreve", U"\u0056\u0306" }, + { "Vbring", U"\u0056\u032f" }, + { "Vcaron", U"\u0056\u030c" }, + { "Vcirc", U"\u0056\u0302" }, + { "Vcy", U"\u0412" }, + { "Vdash", U"\u22a9" }, + { "Vdot", U"\u0056\u0307" }, + { "Verbar", U"\u2016" }, + { "Vgrave", U"\u0056\u0300" }, + { "Vmacr", U"\u0056\u0304" }, + { "Vtilde", U"\u0056\u0303" }, + { "Vuml", U"\u0056\u0308" }, + { "Vvdash", U"\u22aa" }, + { "Wacute", U"\u0057\u0301" }, + { "Wbreve", U"\u0057\u0306" }, + { "Wbring", U"\u0057\u032f" }, + { "Wcaron", U"\u0057\u030c" }, + { "Wcirc", U"\u0174" }, + { "Wcirc", U"\u0057\u0302" }, + { "Wdot", U"\u0057\u0307" }, + { "Wgrave", U"\u0057\u0300" }, + { "Wmacr", U"\u0057\u0304" }, + { "Wtilde", U"\u0057\u0303" }, + { "Wuml", U"\u0057\u0308" }, + { "Xacute", U"\u0058\u0301" }, + { "Xbreve", U"\u0058\u0306" }, + { "Xbring", U"\u0058\u032f" }, + { "Xcaron", U"\u0058\u030c" }, + { "Xcirc", U"\u0058\u0302" }, + { "Xdot", U"\u0058\u0307" }, + { "Xgr", U"\u039e" }, + { "Xgrave", U"\u0058\u0300" }, + { "Xi", U"\u039e" }, + { "Xmacr", U"\u0058\u0304" }, + { "Xtilde", U"\u0058\u0303" }, + { "Xuml", U"\u0058\u0308" }, + { "YAcy", U"\u042f" }, + { "YIcy", U"\u0407" }, + { "YUcy", U"\u042e" }, + { "Yacute", U"\u00dd" }, + { "Yacute", U"\u0059\u0301" }, + { "Ybreve", U"\u0059\u0306" }, + { "Ybring", U"\u0059\u032f" }, + { "Ycaron", U"\u0059\u030c" }, + { "Ycirc", U"\u0176" }, + { "Ycirc", U"\u0059\u0302" }, + { "Ycy", U"\u042b" }, + { "Ydot", U"\u0059\u0307" }, + { "Ygrave", U"\u0059\u0300" }, + { "Ymacr", U"\u0059\u0304" }, + { "Ytilde", U"\u0059\u0303" }, + { "Yuml", U"\u0178" }, + { "Yuml", U"\u0059\u0308" }, + { "ZHcy", U"\u0416" }, + { "Zacute", U"\u0179" }, + { "Zacute", U"\u005a\u0301" }, + { "Zbreve", U"\u005a\u0306" }, + { "Zbring", U"\u005a\u032f" }, + { "Zcaron", U"\u017d" }, + { "Zcaron", U"\u005a\u030c" }, + { "Zcirc", U"\u005a\u0302" }, + { "Zcy", U"\u0417" }, + { "Zdot", U"\u017b" }, + { "Zdot", U"\u005a\u0307" }, + { "Zeta", U"\u0396" }, + { "Zgr", U"\u0396" }, + { "Zgrave", U"\u005a\u0300" }, + { "Zmacr", U"\u005a\u0304" }, + { "Ztilde", U"\u005a\u0303" }, + { "Zuml", U"\u005a\u0308" }, + { "aacgr", U"\u03ac" }, + { "aacute", U"\u00e1" }, + { "aacute", U"\u0061\u0301" }, + { "abreve", U"\u0103" }, + { "abreve", U"\u0061\u0306" }, + { "abring", U"\u0061\u032f" }, + { "acaron", U"\u0061\u030c" }, + { "acirc", U"\u00e2" }, + { "acirc", U"\u0061\u0302" }, + { "acute", U"\u00b4" }, + { "acy", U"\u0430" }, + { "adot", U"\u0061\u0307" }, + { "aelig", U"\u00e6" }, + { "agr", U"\u03b1" }, + { "agrave", U"\u00e0" }, + { "agrave", U"\u0061\u0300" }, + { "alefsym", U"\u2135" }, + { "aleph", U"\u2135" }, + { "alpha", U"\u03b1" }, + { "amacr", U"\u0101" }, + { "amacr", U"\u0061\u0304" }, + { "amalg", U"\u2210" }, + { "amp", U"\u0026" }, + { "and", U"\u2227" }, + { "ang", U"\u2220" }, + { "ang90", U"\u221f" }, + { "angmsd", U"\u2221" }, + { "angsph", U"\u2222" }, + { "angst", U"\u212b" }, + { "aogon", U"\u0105" }, + { "ap", U"\u2248" }, + { "ape", U"\u224a" }, + { "apos", U"\u0027" }, + { "apos", U"\u02bc" }, + { "aring", U"\u00e5" }, + { "ast", U"\u002a" }, + { "asymp", U"\u2248" }, + { "atilde", U"\u00e3" }, + { "atilde", U"\u0061\u0303" }, + { "auml", U"\u00e4" }, + { "auml", U"\u0061\u0308" }, + { "b.Delta", U"\u0394" }, + { "b.Gamma", U"\u0393" }, + { "b.Lambda", U"\u039b" }, + { "b.Omega", U"\u03a9" }, + { "b.Phi", U"\u03a6" }, + { "b.Pi", U"\u03a0" }, + { "b.Psi", U"\u03a8" }, + { "b.Sigma", U"\u03a3" }, + { "b.Theta", U"\u0398" }, + { "b.Upsi", U"\u03a5" }, + { "b.Xi", U"\u039e" }, + { "b.alpha", U"\u03b1" }, + { "b.beta", U"\u03b2" }, + { "b.chi", U"\u03c7" }, + { "b.delta", U"\u03b4" }, + { "b.epsi", U"\u03b5" }, + { "b.epsis", U"\u03b5" }, + { "b.epsiv", U"\u03b5" }, + { "b.eta", U"\u03b7" }, + { "b.gamma", U"\u03b3" }, + { "b.gammad", U"\u03dc" }, + { "b.iota", U"\u03b9" }, + { "b.kappa", U"\u03ba" }, + { "b.kappav", U"\u03f0" }, + { "b.lambda", U"\u03bb" }, + { "b.mu", U"\u03bc" }, + { "b.nu", U"\u03bd" }, + { "b.omega", U"\u03ce" }, + { "b.phis", U"\u03c6" }, + { "b.phiv", U"\u03d5" }, + { "b.pi", U"\u03c0" }, + { "b.piv", U"\u03d6" }, + { "b.psi", U"\u03c8" }, + { "b.rho", U"\u03c1" }, + { "b.rhov", U"\u03f1" }, + { "b.sigma", U"\u03c3" }, + { "b.sigmav", U"\u03c2" }, + { "b.tau", U"\u03c4" }, + { "b.thetas", U"\u03b8" }, + { "b.thetav", U"\u03d1" }, + { "b.upsi", U"\u03c5" }, + { "b.xi", U"\u03be" }, + { "b.zeta", U"\u03b6" }, + { "bacute", U"\u0062\u0301" }, + { "barwed", U"\u22bc" }, + { "bbreve", U"\u0062\u0306" }, + { "bbring", U"\u0062\u032f" }, + { "bcaron", U"\u0062\u030c" }, + { "bcirc", U"\u0062\u0302" }, + { "bcong", U"\u224c" }, + { "bcy", U"\u0431" }, + { "bdot", U"\u0062\u0307" }, + { "bdquo", U"\u201e" }, + { "becaus", U"\u2235" }, + { "bepsi", U"\u220d" }, + { "bernou", U"\u212c" }, + { "beta", U"\u03b2" }, + { "beth", U"\u2136" }, + { "bgr", U"\u03b2" }, + { "bgrave", U"\u0062\u0300" }, + { "blank", U"\u2423" }, + { "blk12", U"\u2592" }, + { "blk14", U"\u2591" }, + { "blk34", U"\u2593" }, + { "block", U"\u2588" }, + { "bmacr", U"\u0062\u0304" }, + { "bottom", U"\u22a5" }, + { "bowtie", U"\u22c8" }, + { "boxDL", U"\u2557" }, + { "boxDR", U"\u2554" }, + { "boxDl", U"\u2556" }, + { "boxDr", U"\u2553" }, + { "boxH", U"\u2550" }, + { "boxHD", U"\u2566" }, + { "boxHU", U"\u2569" }, + { "boxHd", U"\u2564" }, + { "boxHu", U"\u2567" }, + { "boxUL", U"\u255d" }, + { "boxUR", U"\u255a" }, + { "boxUl", U"\u255c" }, + { "boxUr", U"\u2559" }, + { "boxV", U"\u2551" }, + { "boxVH", U"\u256c" }, + { "boxVL", U"\u2563" }, + { "boxVR", U"\u2560" }, + { "boxVh", U"\u256b" }, + { "boxVl", U"\u2562" }, + { "boxVr", U"\u255f" }, + { "boxdL", U"\u2555" }, + { "boxdR", U"\u2552" }, + { "boxdl", U"\u2510" }, + { "boxdr", U"\u250c" }, + { "boxh", U"\u2500" }, + { "boxhD", U"\u2565" }, + { "boxhU", U"\u2568" }, + { "boxhd", U"\u252c" }, + { "boxhu", U"\u2534" }, + { "boxuL", U"\u255b" }, + { "boxuR", U"\u2558" }, + { "boxul", U"\u2518" }, + { "boxur", U"\u2514" }, + { "boxv", U"\u2502" }, + { "boxvH", U"\u256a" }, + { "boxvL", U"\u2561" }, + { "boxvR", U"\u255e" }, + { "boxvh", U"\u253c" }, + { "boxvl", U"\u2524" }, + { "boxvr", U"\u251c" }, + { "bprime", U"\u2035" }, + { "breve", U"\u02d8" }, + { "brvbar", U"\u00a6" }, + { "bsim", U"\u223d" }, + { "bsime", U"\u22cd" }, + { "bsol", U"\u005c" }, + { "btilde", U"\u0062\u0303" }, + { "bull", U"\u2022" }, + { "buml", U"\u0062\u0308" }, + { "bump", U"\u224e" }, + { "bumpe", U"\u224f" }, + { "cacute", U"\u0107" }, + { "cacute", U"\u0063\u0301" }, + { "cap", U"\u2229" }, + { "caret", U"\u2041" }, + { "caron", U"\u02c7" }, + { "cbreve", U"\u0063\u0306" }, + { "cbring", U"\u0063\u032f" }, + { "ccaron", U"\u010d" }, + { "ccaron", U"\u0063\u030c" }, + { "ccedil", U"\u00e7" }, + { "ccirc", U"\u0109" }, + { "ccirc", U"\u0063\u0302" }, + { "cdot", U"\u010b" }, + { "cdot", U"\u0063\u0307" }, + { "cedil", U"\u00b8" }, + { "cent", U"\u00a2" }, + { "cgrave", U"\u0063\u0300" }, + { "chcy", U"\u0447" }, + { "check", U"\u2713" }, + { "chi", U"\u03c7" }, + { "cir", U"\u25cb" }, + { "circ", U"\u02c6" }, + { "circlef", U"\u25cf" }, + { "circlefb", U"\u25d2" }, + { "circlefl", U"\u25d0" }, + { "circlefr", U"\u25d1" }, + { "circleft", U"\u25d3" }, + { "cire", U"\u2257" }, + { "clubs", U"\u2663" }, + { "cmacr", U"\u0063\u0304" }, + { "colon", U"\u003a" }, + { "colone", U"\u2254" }, + { "comma", U"\u002c" }, + { "commat", U"\u0040" }, + { "comp", U"\u2201" }, + { "compfn", U"\u2218" }, + { "cong", U"\u2245" }, + { "conint", U"\u222e" }, + { "coprod", U"\u2210" }, + { "copy", U"\u00a9" }, + { "copysr", U"\u2117" }, + { "crarr", U"\u21b5" }, + { "cross", U"\u2717" }, + { "ctilde", U"\u0063\u0303" }, + { "cuepr", U"\u22de" }, + { "cuesc", U"\u22df" }, + { "cularr", U"\u21b6" }, + { "cuml", U"\u0063\u0308" }, + { "cup", U"\u222a" }, + { "cupre", U"\u227c" }, + { "curarr", U"\u21b7" }, + { "curren", U"\u00a4" }, + { "cuvee", U"\u22ce" }, + { "cuwed", U"\u22cf" }, + { "dArr", U"\u21d3" }, + { "dacute", U"\u0064\u0301" }, + { "dagger", U"\u2020" }, + { "daleth", U"\u2138" }, + { "darr", U"\u2193" }, + { "darr2", U"\u21ca" }, + { "dash", U"\u2010" }, + { "dashv", U"\u22a3" }, + { "dblac", U"\u02dd" }, + { "dbreve", U"\u0064\u0306" }, + { "dbring", U"\u0064\u032f" }, + { "dcaron", U"\u010f" }, + { "dcaron", U"\u0064\u030c" }, + { "dcirc", U"\u0064\u0302" }, + { "dcy", U"\u0434" }, + { "ddot", U"\u0064\u0307" }, + { "deg", U"\u00b0" }, + { "delta", U"\u03b4" }, + { "dgr", U"\u03b4" }, + { "dgrave", U"\u0064\u0300" }, + { "dharl", U"\u21c3" }, + { "dharr", U"\u21c2" }, + { "diam", U"\u22c4" }, + { "diamondf", U"\u25c6" }, + { "diams", U"\u2666" }, + { "die", U"\u00a8" }, + { "divide", U"\u00f7" }, + { "divonx", U"\u22c7" }, + { "djcy", U"\u0452" }, + { "dlarr", U"\u2199" }, + { "dlcorn", U"\u231e" }, + { "dlcrop", U"\u230d" }, + { "dmacr", U"\u0064\u0304" }, + { "dollar", U"\u0024" }, + { "dot", U"\u02d9" }, + { "drarr", U"\u2198" }, + { "drcorn", U"\u231f" }, + { "drcrop", U"\u230c" }, + { "dscy", U"\u0455" }, + { "dstrok", U"\u0111" }, + { "dtilde", U"\u0064\u0303" }, + { "dtri", U"\u25bf" }, + { "dtrif", U"\u25be" }, + { "duml", U"\u0064\u0308" }, + { "dzcy", U"\u045f" }, + { "eDot", U"\u2251" }, + { "eacgr", U"\u03ad" }, + { "eacute", U"\u00e9" }, + { "eacute", U"\u0065\u0301" }, + { "ebreve", U"\u0065\u0306" }, + { "ebring", U"\u0065\u032f" }, + { "ecaron", U"\u011b" }, + { "ecaron", U"\u0065\u030c" }, + { "ecir", U"\u2256" }, + { "ecirc", U"\u00ea" }, + { "ecirc", U"\u0065\u0302" }, + { "ecolon", U"\u2255" }, + { "ecy", U"\u044d" }, + { "edot", U"\u0117" }, + { "edot", U"\u0065\u0307" }, + { "edotb", U"\u1eb9" }, + { "eeacgr", U"\u03ae" }, + { "eegr", U"\u03b7" }, + { "efDot", U"\u2252" }, + { "egr", U"\u03b5" }, + { "egrave", U"\u00e8" }, + { "egrave", U"\u0065\u0300" }, + { "egs", U"\u22dd" }, + { "ell", U"\u2113" }, + { "els", U"\u22dc" }, + { "emacr", U"\u0113" }, + { "emacr", U"\u0065\u0304" }, + { "empty", U"\u2205" }, + { "emsp", U"\u2003" }, + { "emsp13", U"\u2004" }, + { "emsp14", U"\u2005" }, + { "eng", U"\u014b" }, + { "ensp", U"\u2002" }, + { "eogon", U"\u0119" }, + { "epsi", U"\u03b5" }, + { "epsilon", U"\u03b5" }, + { "epsis", U"\u220a" }, + { "equals", U"\u003d" }, + { "equiv", U"\u2261" }, + { "erDot", U"\u2253" }, + { "esdot", U"\u2250" }, + { "eta", U"\u03b7" }, + { "eth", U"\u00f0" }, + { "etilde", U"\u0065\u0303" }, + { "euml", U"\u00eb" }, + { "euml", U"\u0065\u0308" }, + { "euro", U"\u20ac" }, + { "excl", U"\u0021" }, + { "exist", U"\u2203" }, + { "facute", U"\u0066\u0301" }, + { "fbreve", U"\u0066\u0306" }, + { "fbring", U"\u0066\u032f" }, + { "fcaron", U"\u0066\u030c" }, + { "fcirc", U"\u0066\u0302" }, + { "fcy", U"\u0444" }, + { "fdot", U"\u0066\u0307" }, + { "female", U"\u2640" }, + { "ffilig", U"\ufb03" }, + { "fflig", U"\ufb00" }, + { "ffllig", U"\ufb04" }, + { "fgrave", U"\u0066\u0300" }, + { "filig", U"\ufb01" }, + { "flat", U"\u266d" }, + { "fllig", U"\ufb02" }, + { "fmacr", U"\u0066\u0304" }, + { "fnof", U"\u0192" }, + { "forall", U"\u2200" }, + { "fork", U"\u22d4" }, + { "frac12", U"\u00bd" }, + { "frac13", U"\u2153" }, + { "frac14", U"\u00bc" }, + { "frac15", U"\u2155" }, + { "frac16", U"\u2159" }, + { "frac18", U"\u215b" }, + { "frac23", U"\u2154" }, + { "frac25", U"\u2156" }, + { "frac34", U"\u00be" }, + { "frac35", U"\u2157" }, + { "frac38", U"\u215c" }, + { "frac45", U"\u2158" }, + { "frac56", U"\u215a" }, + { "frac58", U"\u215d" }, + { "frac78", U"\u215e" }, + { "frasl", U"\u2044" }, + { "frown", U"\u2322" }, + { "ftilde", U"\u0066\u0303" }, + { "fuml", U"\u0066\u0308" }, + { "gE", U"\u2267" }, + { "gacute", U"\u01f5" }, + { "gacute", U"\u0067\u0301" }, + { "gamma", U"\u03b3" }, + { "gammad", U"\u03dc" }, + { "gbreve", U"\u011f" }, + { "gbreve", U"\u0067\u0306" }, + { "gbring", U"\u0067\u032f" }, + { "gcaron", U"\u0067\u030c" }, + { "gcedil", U"\u0123" }, + { "gcirc", U"\u011d" }, + { "gcirc", U"\u0067\u0302" }, + { "gcy", U"\u0433" }, + { "gdot", U"\u0121" }, + { "gdot", U"\u0067\u0307" }, + { "ge", U"\u2265" }, + { "gel", U"\u22db" }, + { "ges", U"\u2265" }, + { "ggr", U"\u03b3" }, + { "ggrave", U"\u0067\u0300" }, + { "gimel", U"\u2137" }, + { "gjcy", U"\u0453" }, + { "gl", U"\u2277" }, + { "gmacr", U"\u0067\u0304" }, + { "gnE", U"\u2269" }, + { "gne", U"\u2269" }, + { "gnsim", U"\u22e7" }, + { "grave", U"\u0060" }, + { "gsdot", U"\u22d7" }, + { "gsim", U"\u2273" }, + { "gt", U"\u003e" }, + { "gtilde", U"\u0067\u0303" }, + { "guml", U"\u0067\u0308" }, + { "gvnE", U"\u2269" }, + { "hArr", U"\u21d4" }, + { "hacute", U"\u0068\u0301" }, + { "hairsp", U"\u200a" }, + { "half", U"\u00bd" }, + { "hamilt", U"\u210b" }, + { "hardcy", U"\u044a" }, + { "harr", U"\u2194" }, + { "harrw", U"\u21ad" }, + { "hbreve", U"\u0068\u0306" }, + { "hbring", U"\u0068\u032f" }, + { "hcaron", U"\u0068\u030c" }, + { "hcirc", U"\u0125" }, + { "hcirc", U"\u0068\u0302" }, + { "hdot", U"\u0068\u0307" }, + { "hearts", U"\u2665" }, + { "hellip", U"\u2026" }, + { "hgrave", U"\u0068\u0300" }, + { "hmacr", U"\u0068\u0304" }, + { "horbar", U"\u2015" }, + { "hstrok", U"\u0127" }, + { "htilde", U"\u0068\u0303" }, + { "huml", U"\u0068\u0308" }, + { "hybull", U"\u2043" }, + { "hyphen", U"\u002d" }, + { "iacgr", U"\u03af" }, + { "iacute", U"\u00ed" }, + { "iacute", U"\u0069\u0301" }, + { "ibreve", U"\u0069\u0306" }, + { "ibring", U"\u0069\u032f" }, + { "icaron", U"\u0069\u030c" }, + { "icirc", U"\u00ee" }, + { "icirc", U"\u0069\u0302" }, + { "icy", U"\u0438" }, + { "idiagr", U"\u0390" }, + { "idigr", U"\u03ca" }, + { "idot", U"\u0069\u0307" }, + { "iecy", U"\u0435" }, + { "iexcl", U"\u00a1" }, + { "iff", U"\u21d4" }, + { "igr", U"\u03b9" }, + { "igrave", U"\u00ec" }, + { "igrave", U"\u0069\u0300" }, + { "ijlig", U"\u0133" }, + { "imacr", U"\u012b" }, + { "imacr", U"\u0069\u0304" }, + { "image", U"\u2111" }, + { "incare", U"\u2105" }, + { "infin", U"\u221e" }, + { "inodot", U"\u0131" }, + { "inodot", U"\u0131" }, + { "int", U"\u222b" }, + { "intcal", U"\u22ba" }, + { "iocy", U"\u0451" }, + { "iogon", U"\u012f" }, + { "iota", U"\u03b9" }, + { "iquest", U"\u00bf" }, + { "isin", U"\u2208" }, + { "itilde", U"\u0129" }, + { "itilde", U"\u0069\u0303" }, + { "iukcy", U"\u0456" }, + { "iuml", U"\u00ef" }, + { "iuml", U"\u0069\u0308" }, + { "jacute", U"\u006a\u0301" }, + { "jbreve", U"\u006a\u0306" }, + { "jbring", U"\u006a\u032f" }, + { "jcaron", U"\u006a\u030c" }, + { "jcirc", U"\u0135" }, + { "jcirc", U"\u006a\u0302" }, + { "jcy", U"\u0439" }, + { "jdot", U"\u006a\u0307" }, + { "jgrave", U"\u006a\u0300" }, + { "jmacr", U"\u006a\u0304" }, + { "jsercy", U"\u0458" }, + { "jtilde", U"\u006a\u0303" }, + { "jukcy", U"\u0454" }, + { "juml", U"\u006a\u0308" }, + { "kacute", U"\u006b\u0301" }, + { "kappa", U"\u03ba" }, + { "kappav", U"\u03f0" }, + { "kbreve", U"\u006b\u0306" }, + { "kbring", U"\u006b\u032f" }, + { "kcaron", U"\u006b\u030c" }, + { "kcedil", U"\u0137" }, + { "kcirc", U"\u006b\u0302" }, + { "kcy", U"\u043a" }, + { "kdot", U"\u006b\u0307" }, + { "kgr", U"\u03ba" }, + { "kgrave", U"\u006b\u0300" }, + { "kgreen", U"\u0138" }, + { "khcy", U"\u0445" }, + { "khgr", U"\u03c7" }, + { "kjcy", U"\u045c" }, + { "kmacr", U"\u006b\u0304" }, + { "ktilde", U"\u006b\u0303" }, + { "kuml", U"\u006b\u0308" }, + { "lAarr", U"\u21da" }, + { "lArr", U"\u21d0" }, + { "lE", U"\u2266" }, + { "lacute", U"\u013a" }, + { "lacute", U"\u006c\u0301" }, + { "lagran", U"\u2112" }, + { "lambda", U"\u03bb" }, + { "lang", U"\u2329" }, + { "laquo", U"\u00ab" }, + { "larr", U"\u2190" }, + { "larr2", U"\u21c7" }, + { "larrhk", U"\u21a9" }, + { "larrlp", U"\u21ab" }, + { "larrtl", U"\u21a2" }, + { "lbreve", U"\u006c\u0306" }, + { "lbring", U"\u006c\u032f" }, + { "lcaron", U"\u013e" }, + { "lcaron", U"\u006c\u030c" }, + { "lcedil", U"\u013c" }, + { "lceil", U"\u2308" }, + { "lcirc", U"\u006c\u0302" }, + { "lcub", U"\u007b" }, + { "lcy", U"\u043b" }, + { "ldot", U"\u22d6" }, + { "ldot", U"\u006c\u0307" }, + { "ldquo", U"\u201c" }, + { "ldquor", U"\u201e" }, + { "le", U"\u2264" }, + { "leg", U"\u22da" }, + { "les", U"\u2264" }, + { "lfloor", U"\u230a" }, + { "lg", U"\u2276" }, + { "lgr", U"\u03bb" }, + { "lgrave", U"\u006c\u0300" }, + { "lhard", U"\u21bd" }, + { "lharu", U"\u21bc" }, + { "lhblk", U"\u2584" }, + { "ljcy", U"\u0459" }, + { "lmacr", U"\u006c\u0304" }, + { "lmidot", U"\u0140" }, + { "lnE", U"\u2268" }, + { "lne", U"\u2268" }, + { "lnsim", U"\u22e6" }, + { "lowast", U"\u2217" }, + { "lowbar", U"\u005f" }, + { "loz", U"\u25ca" }, + { "loz", U"\u2727" }, + { "lozf", U"\u2726" }, + { "lpar", U"\u0028" }, + { "lrarr2", U"\u21c6" }, + { "lrhar2", U"\u21cb" }, + { "lrm", U"\u200e" }, + { "lsaquo", U"\u2039" }, + { "lsh", U"\u21b0" }, + { "lsim", U"\u2272" }, + { "lsqb", U"\u005b" }, + { "lsquo", U"\u2018" }, + { "lsquor", U"\u201a" }, + { "lstrok", U"\u0142" }, + { "lt", U"\u003c" }, + { "lthree", U"\u22cb" }, + { "ltilde", U"\u006c\u0303" }, + { "ltimes", U"\u22c9" }, + { "ltri", U"\u25c3" }, + { "ltrie", U"\u22b4" }, + { "ltrif", U"\u25c2" }, + { "luml", U"\u006c\u0308" }, + { "lvnE", U"\u2268" }, + { "macr", U"\u00af" }, + { "macute", U"\u006d\u0301" }, + { "male", U"\u2642" }, + { "malt", U"\u2720" }, + { "map", U"\u21a6" }, + { "marker", U"\u25ae" }, + { "mbreve", U"\u006d\u0306" }, + { "mbring", U"\u006d\u032f" }, + { "mcaron", U"\u006d\u030c" }, + { "mcirc", U"\u006d\u0302" }, + { "mcy", U"\u043c" }, + { "mdash", U"\u2014" }, + { "mdot", U"\u006d\u0307" }, + { "mgr", U"\u03bc" }, + { "mgrave", U"\u006d\u0300" }, + { "micro", U"\u00b5" }, + { "mid", U"\u2223" }, + { "middot", U"\u00b7" }, + { "minus", U"\u2212" }, + { "minusb", U"\u229f" }, + { "mldr", U"\u2026" }, + { "mmacr", U"\u006d\u0304" }, + { "mnplus", U"\u2213" }, + { "models", U"\u22a7" }, + { "mtilde", U"\u006d\u0303" }, + { "mu", U"\u03bc" }, + { "mumap", U"\u22b8" }, + { "muml", U"\u006d\u0308" }, + { "nVDash", U"\u22af" }, + { "nVdash", U"\u22ae" }, + { "nabla", U"\u2207" }, + { "nacute", U"\u0144" }, + { "nacute", U"\u006e\u0301" }, + { "nap", U"\u2249" }, + { "napos", U"\u0149" }, + { "natur", U"\u266e" }, + { "nbreve", U"\u006e\u0306" }, + { "nbring", U"\u006e\u032f" }, + { "nbsp", U"\u00a0" }, + { "ncaron", U"\u0148" }, + { "ncaron", U"\u006e\u030c" }, + { "ncedil", U"\u0146" }, + { "ncirc", U"\u006e\u0302" }, + { "ncong", U"\u2247" }, + { "ncy", U"\u043d" }, + { "ndash", U"\u2013" }, + { "ndot", U"\u006e\u0307" }, + { "ne", U"\u2260" }, + { "nearr", U"\u2197" }, + { "nequiv", U"\u2262" }, + { "nexist", U"\u2204" }, + { "nge", U"\u2271" }, + { "nges", U"\u2271" }, + { "ngr", U"\u03bd" }, + { "ngrave", U"\u006e\u0300" }, + { "ngt", U"\u226f" }, + { "nhArr", U"\u21ce" }, + { "nharr", U"\u21ae" }, + { "ni", U"\u220b" }, + { "njcy", U"\u045a" }, + { "nlArr", U"\u21cd" }, + { "nlarr", U"\u219a" }, + { "nldr", U"\u2025" }, + { "nle", U"\u2270" }, + { "nles", U"\u2270" }, + { "nlt", U"\u226e" }, + { "nltri", U"\u22ea" }, + { "nltrie", U"\u22ec" }, + { "nmacr", U"\u006e\u0304" }, + { "nmid", U"\u2224" }, + { "not", U"\u00ac" }, + { "notin", U"\u2209" }, + { "npar", U"\u2226" }, + { "npr", U"\u2280" }, + { "npre", U"\u22e0" }, + { "nrArr", U"\u21cf" }, + { "nrarr", U"\u219b" }, + { "nrtri", U"\u22eb" }, + { "nrtrie", U"\u22ed" }, + { "nsc", U"\u2281" }, + { "nsce", U"\u22e1" }, + { "nsim", U"\u2241" }, + { "nsime", U"\u2244" }, + { "nspar", U"\u2226" }, + { "nsub", U"\u2284" }, + { "nsubE", U"\u2288" }, + { "nsube", U"\u2288" }, + { "nsup", U"\u2285" }, + { "nsupE", U"\u2289" }, + { "nsupe", U"\u2289" }, + { "ntilde", U"\u00f1" }, + { "ntilde", U"\u006e\u0303" }, + { "nu", U"\u03bd" }, + { "num", U"\u0023" }, + { "numero", U"\u2116" }, + { "numl", U"\u006e\u0308" }, + { "numsp", U"\u2007" }, + { "nvDash", U"\u22ad" }, + { "nvdash", U"\u22ac" }, + { "nwarr", U"\u2196" }, + { "oS", U"\u24c8" }, + { "oacgr", U"\u03cc" }, + { "oacute", U"\u00f3" }, + { "oacute", U"\u006f\u0301" }, + { "oast", U"\u229b" }, + { "obreve", U"\u006f\u0306" }, + { "obring", U"\u006f\u032f" }, + { "ocaron", U"\u01d2" }, + { "ocaron", U"\u006f\u030c" }, + { "ocir", U"\u229a" }, + { "ocirc", U"\u00f4" }, + { "ocirc", U"\u006f\u0302" }, + { "ocy", U"\u043e" }, + { "odash", U"\u229d" }, + { "odblac", U"\u0151" }, + { "odot", U"\u2299" }, + { "odot", U"\u006f\u0307" }, + { "odotb", U"\u1ecd" }, + { "oelig", U"\u0153" }, + { "ogon", U"\u02db" }, + { "ogr", U"\u03bf" }, + { "ograve", U"\u00f2" }, + { "ograve", U"\u006f\u0300" }, + { "ohacgr", U"\u03ce" }, + { "ohgr", U"\u03c9" }, + { "ohm", U"\u2126" }, + { "olarr", U"\u21ba" }, + { "oline", U"\u203e" }, + { "omacr", U"\u014d" }, + { "omacr", U"\u006f\u0304" }, + { "omega", U"\u03c9" }, + { "omicron", U"\u03bf" }, + { "ominus", U"\u2296" }, + { "oplus", U"\u2295" }, + { "or", U"\u2228" }, + { "orarr", U"\u21bb" }, + { "order", U"\u2134" }, + { "ordf", U"\u00aa" }, + { "ordm", U"\u00ba" }, + { "oslash", U"\u00f8" }, + { "osol", U"\u2298" }, + { "otilde", U"\u00f5" }, + { "otilde", U"\u006f\u0303" }, + { "otimes", U"\u2297" }, + { "ouml", U"\u00f6" }, + { "ouml", U"\u006f\u0308" }, + { "pacute", U"\u0070\u0301" }, + { "page", U"\u000c" }, + { "par", U"\u2225" }, + { "para", U"\u00b6" }, + { "part", U"\u2202" }, + { "pbreve", U"\u0070\u0306" }, + { "pbring", U"\u0070\u032f" }, + { "pcaron", U"\u0070\u030c" }, + { "pcirc", U"\u0070\u0302" }, + { "pcy", U"\u043f" }, + { "pdot", U"\u0070\u0307" }, + { "percnt", U"\u0025" }, + { "period", U"\u002e" }, + { "permil", U"\u2030" }, + { "perp", U"\u22a5" }, + { "pgr", U"\u03c0" }, + { "pgrave", U"\u0070\u0300" }, + { "phgr", U"\u03c6" }, + { "phi", U"\u03c6" }, + { "phis", U"\u03c6" }, + { "phiv", U"\u03d5" }, + { "phmmat", U"\u2133" }, + { "phone", U"\u260e" }, + { "pi", U"\u03c0" }, + { "piv", U"\u03d6" }, + { "planck", U"\u210f" }, + { "plus", U"\u002b" }, + { "plusb", U"\u229e" }, + { "plusdo", U"\u2214" }, + { "plusmn", U"\u00b1" }, + { "pmacr", U"\u0070\u0304" }, + { "pound", U"\u00a3" }, + { "pr", U"\u227a" }, + { "pre", U"\u227c" }, + { "prime", U"\u2032" }, + { "prnsim", U"\u22e8" }, + { "prod", U"\u220f" }, + { "prop", U"\u221d" }, + { "prsim", U"\u227e" }, + { "psgr", U"\u03c8" }, + { "psi", U"\u03c8" }, + { "ptilde", U"\u0070\u0303" }, + { "puml", U"\u0070\u0308" }, + { "puncsp", U"\u2008" }, + { "qacute", U"\u0071\u0301" }, + { "qbreve", U"\u0071\u0306" }, + { "qbring", U"\u0071\u032f" }, + { "qcaron", U"\u0071\u030c" }, + { "qcirc", U"\u0071\u0302" }, + { "qdot", U"\u0071\u0307" }, + { "qgrave", U"\u0071\u0300" }, + { "qmacr", U"\u0071\u0304" }, + { "qtilde", U"\u0071\u0303" }, + { "quest", U"\u003f" }, + { "quml", U"\u0071\u0308" }, + { "quot", U"\u0022" }, + { "rAarr", U"\u21db" }, + { "rArr", U"\u21d2" }, + { "racute", U"\u0155" }, + { "racute", U"\u0072\u0301" }, + { "radic", U"\u221a" }, + { "rang", U"\u232a" }, + { "raquo", U"\u00bb" }, + { "rarr", U"\u2192" }, + { "rarr2", U"\u21c9" }, + { "rarrhk", U"\u21aa" }, + { "rarrlp", U"\u21ac" }, + { "rarrtl", U"\u21a3" }, + { "rarrw", U"\u219d" }, + { "rbreve", U"\u0072\u0306" }, + { "rbring", U"\u0072\u032f" }, + { "rcaron", U"\u0159" }, + { "rcaron", U"\u0072\u030c" }, + { "rcedil", U"\u0157" }, + { "rceil", U"\u2309" }, + { "rcirc", U"\u0072\u0302" }, + { "rcub", U"\u007d" }, + { "rcy", U"\u0440" }, + { "rdot", U"\u0072\u0307" }, + { "rdquo", U"\u201d" }, + { "rdquor", U"\u201c" }, + { "real", U"\u211c" }, + { "rect", U"\u25ad" }, + { "reg", U"\u00ae" }, + { "rfloor", U"\u230b" }, + { "rgr", U"\u03c1" }, + { "rgrave", U"\u0072\u0300" }, + { "rhard", U"\u21c1" }, + { "rharu", U"\u21c0" }, + { "rho", U"\u03c1" }, + { "rhov", U"\u03f1" }, + { "ring", U"\u02da" }, + { "rlarr2", U"\u21c4" }, + { "rlhar2", U"\u21cc" }, + { "rlm", U"\u200f" }, + { "rmacr", U"\u0072\u0304" }, + { "rpar", U"\u0029" }, + { "rsaquo", U"\u203a" }, + { "rsh", U"\u21b1" }, + { "rsqb", U"\u005d" }, + { "rsquo", U"\u2019" }, + { "rsquor", U"\u2018" }, + { "rthree", U"\u22cc" }, + { "rtilde", U"\u0072\u0303" }, + { "rtimes", U"\u22ca" }, + { "rtri", U"\u25b9" }, + { "rtrie", U"\u22b5" }, + { "rtrif", U"\u25b8" }, + { "ruml", U"\u0072\u0308" }, + { "rx", U"\u211e" }, + { "sacute", U"\u015b" }, + { "sacute", U"\u0073\u0301" }, + { "samalg", U"\u2210" }, + { "sbquo", U"\u201a" }, + { "sbreve", U"\u0073\u0306" }, + { "sbring", U"\u0073\u032f" }, + { "sbsol", U"\u005c" }, + { "sc", U"\u227b" }, + { "scaron", U"\u0161" }, + { "scaron", U"\u0073\u030c" }, + { "sccue", U"\u227d" }, + { "sce", U"\u227d" }, + { "scedil", U"\u015f" }, + { "schwa", U"\u0259" }, + { "schwaacute", U"\u0259\u0301" }, + { "schwadgrave", U"\u0259\u030f" }, + { "schwagrave", U"\u0259\u0300" }, + { "schwamacr", U"\u0259\u0304" }, + { "scirc", U"\u015d" }, + { "scirc", U"\u0073\u0302" }, + { "scnsim", U"\u22e9" }, + { "scsim", U"\u227f" }, + { "scy", U"\u0441" }, + { "sdot", U"\u22c5" }, + { "sdot", U"\u0073\u0307" }, + { "sdotb", U"\u22a1" }, + { "sect", U"\u00a7" }, + { "semi", U"\u003b" }, + { "setmn", U"\u2216" }, + { "sext", U"\u2736" }, + { "sfgr", U"\u03c2" }, + { "sfrown", U"\u2322" }, + { "sgr", U"\u03c3" }, + { "sgrave", U"\u0073\u0300" }, + { "sharp", U"\u266f" }, + { "shchcy", U"\u0449" }, + { "shcy", U"\u0448" }, + { "shy", U"\u00ad" }, + { "sigma", U"\u03c3" }, + { "sigmaf", U"\u03c2" }, + { "sigmav", U"\u03c2" }, + { "sim", U"\u223c" }, + { "sime", U"\u2243" }, + { "smacr", U"\u0073\u0304" }, + { "smile", U"\u2323" }, + { "softcy", U"\u044c" }, + { "sol", U"\u002f" }, + { "spades", U"\u2660" }, + { "spar", U"\u2225" }, + { "sqcap", U"\u2293" }, + { "sqcup", U"\u2294" }, + { "sqsub", U"\u228f" }, + { "sqsube", U"\u2291" }, + { "sqsup", U"\u2290" }, + { "sqsupe", U"\u2292" }, + { "squ", U"\u25a1" }, + { "square", U"\u25a1" }, + { "squarf", U"\u25a0" }, + { "squf", U"\u25aa" }, + { "ssetmn", U"\u2216" }, + { "ssmile", U"\u2323" }, + { "sstarf", U"\u22c6" }, + { "star", U"\u2606" }, + { "starf", U"\u2605" }, + { "stilde", U"\u0073\u0303" }, + { "sub", U"\u2282" }, + { "subE", U"\u2286" }, + { "sube", U"\u2286" }, + { "subnE", U"\u228a" }, + { "subne", U"\u228a" }, + { "sum", U"\u2211" }, + { "suml", U"\u0073\u0308" }, + { "sung", U"\u266a" }, + { "sup", U"\u2283" }, + { "sup1", U"\u00b9" }, + { "sup2", U"\u00b2" }, + { "sup3", U"\u00b3" }, + { "supE", U"\u2287" }, + { "supe", U"\u2287" }, + { "supnE", U"\u228b" }, + { "supne", U"\u228b" }, + { "szlig", U"\u00df" }, + { "tacute", U"\u0074\u0301" }, + { "target", U"\u2316" }, + { "tau", U"\u03c4" }, + { "tbreve", U"\u0074\u0306" }, + { "tbring", U"\u0074\u032f" }, + { "tcaron", U"\u0165" }, + { "tcaron", U"\u0074\u030c" }, + { "tcedil", U"\u0163" }, + { "tcirc", U"\u0074\u0302" }, + { "tcy", U"\u0442" }, + { "tdot", U"\u20db" }, + { "tdot", U"\u0074\u0307" }, + { "telrec", U"\u2315" }, + { "tgr", U"\u03c4" }, + { "tgrave", U"\u0074\u0300" }, + { "there4", U"\u2234" }, + { "theta", U"\u03b8" }, + { "thetas", U"\u03b8" }, + { "thetasym", U"\u03d1" }, + { "thetav", U"\u03d1" }, + { "thgr", U"\u03b8" }, + { "thinsp", U"\u2009" }, + { "thkap", U"\u2248" }, + { "thksim", U"\u223c" }, + { "thorn", U"\u00fe" }, + { "tilde", U"\u02dc" }, + { "times", U"\u00d7" }, + { "timesb", U"\u22a0" }, + { "tmacr", U"\u0074\u0304" }, + { "top", U"\u22a4" }, + { "tprime", U"\u2034" }, + { "trade", U"\u2122" }, + { "trie", U"\u225c" }, + { "tscy", U"\u0446" }, + { "tshcy", U"\u045b" }, + { "tstrok", U"\u0167" }, + { "ttilde", U"\u0074\u0303" }, + { "tuml", U"\u0074\u0308" }, + { "twixt", U"\u226c" }, + { "uArr", U"\u21d1" }, + { "uacgr", U"\u03cd" }, + { "uacute", U"\u00fa" }, + { "uacute", U"\u0075\u0301" }, + { "uarr", U"\u2191" }, + { "uarr2", U"\u21c8" }, + { "ubrcy", U"\u045e" }, + { "ubreve", U"\u016d" }, + { "ubreve", U"\u0075\u0306" }, + { "ubring", U"\u0075\u032f" }, + { "ucaron", U"\u0075\u030c" }, + { "ucirc", U"\u00fb" }, + { "ucirc", U"\u0075\u0302" }, + { "ucy", U"\u0443" }, + { "udblac", U"\u0171" }, + { "udiagr", U"\u03b0" }, + { "udigr", U"\u03cb" }, + { "udot", U"\u0075\u0307" }, + { "ugr", U"\u03c5" }, + { "ugrave", U"\u00f9" }, + { "ugrave", U"\u0075\u0300" }, + { "uharl", U"\u21bf" }, + { "uharr", U"\u21be" }, + { "uhblk", U"\u2580" }, + { "ulcorn", U"\u231c" }, + { "ulcrop", U"\u230f" }, + { "umacr", U"\u016b" }, + { "umacr", U"\u0075\u0304" }, + { "uml", U"\u00a8" }, + { "uogon", U"\u0173" }, + { "uplus", U"\u228e" }, + { "upsi", U"\u03c5" }, + { "upsih", U"\u03d2" }, + { "upsilon", U"\u03c5" }, + { "urcorn", U"\u231d" }, + { "urcrop", U"\u230e" }, + { "uring", U"\u016f" }, + { "utilde", U"\u0169" }, + { "utilde", U"\u0075\u0303" }, + { "utri", U"\u25b5" }, + { "utrif", U"\u25b4" }, + { "uuml", U"\u00fc" }, + { "uuml", U"\u0075\u0308" }, + { "vArr", U"\u21d5" }, + { "vDash", U"\u22a8" }, + { "vacute", U"\u0076\u0301" }, + { "varr", U"\u2195" }, + { "vbreve", U"\u0076\u0306" }, + { "vbring", U"\u0076\u032f" }, + { "vcaron", U"\u0076\u030c" }, + { "vcirc", U"\u0076\u0302" }, + { "vcy", U"\u0432" }, + { "vdash", U"\u22a2" }, + { "vdot", U"\u0076\u0307" }, + { "veebar", U"\u22bb" }, + { "vellip", U"\u22ee" }, + { "verbar", U"\u007c" }, + { "vgrave", U"\u0076\u0300" }, + { "vltri", U"\u22b2" }, + { "vmacr", U"\u0076\u0304" }, + { "vprime", U"\u2032" }, + { "vprop", U"\u221d" }, + { "vrtri", U"\u22b3" }, + { "vsubnE", U"\u228a" }, + { "vsubne", U"\u228a" }, + { "vsupnE", U"\u228b" }, + { "vsupne", U"\u228b" }, + { "vtab", U"\u000b" }, + { "vtilde", U"\u0076\u0303" }, + { "vuml", U"\u0076\u0308" }, + { "wacute", U"\u0077\u0301" }, + { "wbreve", U"\u0077\u0306" }, + { "wbring", U"\u0077\u032f" }, + { "wcaron", U"\u0077\u030c" }, + { "wcirc", U"\u0175" }, + { "wcirc", U"\u0077\u0302" }, + { "wdot", U"\u0077\u0307" }, + { "wedgeq", U"\u2259" }, + { "weierp", U"\u2118" }, + { "wgrave", U"\u0077\u0300" }, + { "wmacr", U"\u0077\u0304" }, + { "wreath", U"\u2240" }, + { "wtilde", U"\u0077\u0303" }, + { "wuml", U"\u0077\u0308" }, + { "xacute", U"\u0078\u0301" }, + { "xbreve", U"\u0078\u0306" }, + { "xbring", U"\u0078\u032f" }, + { "xcaron", U"\u0078\u030c" }, + { "xcirc", U"\u25cb" }, + { "xcirc", U"\u0078\u0302" }, + { "xdot", U"\u0078\u0307" }, + { "xdtri", U"\u25bd" }, + { "xgr", U"\u03be" }, + { "xgrave", U"\u0078\u0300" }, + { "xhArr", U"\u2194" }, + { "xharr", U"\u2194" }, + { "xi", U"\u03be" }, + { "xlArr", U"\u21d0" }, + { "xmacr", U"\u0078\u0304" }, + { "xrArr", U"\u21d2" }, + { "xtilde", U"\u0078\u0303" }, + { "xuml", U"\u0078\u0308" }, + { "xutri", U"\u25b3" }, + { "yacute", U"\u00fd" }, + { "yacute", U"\u0079\u0301" }, + { "yacy", U"\u044f" }, + { "ybreve", U"\u0079\u0306" }, + { "ybring", U"\u0079\u032f" }, + { "ycaron", U"\u0079\u030c" }, + { "ycirc", U"\u0177" }, + { "ycirc", U"\u0079\u0302" }, + { "ycy", U"\u044b" }, + { "ydot", U"\u0079\u0307" }, + { "yen", U"\u00a5" }, + { "ygrave", U"\u0079\u0300" }, + { "yicy", U"\u0457" }, + { "ymacr", U"\u0079\u0304" }, + { "ytilde", U"\u0079\u0303" }, + { "yucy", U"\u044e" }, + { "yuml", U"\u00ff" }, + { "yuml", U"\u0079\u0308" }, + { "zacute", U"\u017a" }, + { "zacute", U"\u007a\u0301" }, + { "zbreve", U"\u007a\u0306" }, + { "zbring", U"\u007a\u032f" }, + { "zcaron", U"\u017e" }, + { "zcaron", U"\u007a\u030c" }, + { "zcirc", U"\u007a\u0302" }, + { "zcy", U"\u0437" }, + { "zdot", U"\u017c" }, + { "zdot", U"\u007a\u0307" }, + { "zeta", U"\u03b6" }, + { "zgr", U"\u03b6" }, + { "zgrave", U"\u007a\u0300" }, + { "zhcy", U"\u0436" }, + { "zmacr", U"\u007a\u0304" }, + { "ztilde", U"\u007a\u0303" }, + { "zuml", U"\u007a\u0308" }, + { "zwj", U"\u200d" }, + { "zwnj", U"\u200c" }, }; inline const size_t unicode_sgml[] = { diff --git a/include/stdex/string.hpp b/include/stdex/string.hpp index bc4f20048..1a65585fe 100644 --- a/include/stdex/string.hpp +++ b/include/stdex/string.hpp @@ -207,15 +207,28 @@ namespace stdex /// \param[in] glyph Start of a glyph /// \param[in] count Code unit limit /// - inline size_t glyphlen(_In_reads_or_z_opt_(count) const wchar_t* glyph, _In_ size_t count) + inline size_t glyphlen(_In_reads_or_z_opt_(count) const utf16_t* glyph, _In_ size_t count) { _Assume_(glyph || !count); if (count) { -#ifdef _WIN32 size_t i = count < 2 || !is_surrogate_pair(glyph) ? 1 : 2; -#else + for (; i < count && iscombining(glyph[i]); ++i); + return i; + } + return 0; + } + + /// + /// Return number of code units the glyph represents + /// + /// \param[in] glyph Start of a glyph + /// \param[in] count Code unit limit + /// + inline size_t glyphlen(_In_reads_or_z_opt_(count) const utf32_t* glyph, _In_ size_t count) + { + _Assume_(glyph || !count); + if (count) { size_t i = 1; -#endif for (; i < count && iscombining(glyph[i]); ++i); return i; } @@ -228,17 +241,28 @@ namespace stdex /// \param[in] str Start of a string /// \param[in] count Length of a string in code units /// - inline size_t glyphrlen(_In_reads_or_z_opt_(count) const wchar_t* str, _In_ size_t count) + inline size_t glyphrlen(_In_reads_or_z_opt_(count) const utf16_t* str, _In_ size_t count) { _Assume_(count && str && str[count - 1]); for (size_t i = count; i--;) { - if (!iscombining(str[i])) { -#ifdef _WIN32 + if (!iscombining(str[i])) return count - (!is_low_surrogate(str[i]) || i == 0 || !is_high_surrogate(str[i - 1]) ? i : i - 1); -#else - return count - i; -#endif - } + } + return count; + } + + /// + /// Return number of code units the last glyph in the string represents + /// + /// \param[in] str Start of a string + /// \param[in] count Length of a string in code units + /// + inline size_t glyphrlen(_In_reads_or_z_opt_(count) const utf32_t* str, _In_ size_t count) + { + _Assume_(count && str && str[count - 1]); + for (size_t i = count; i--;) { + if (!iscombining(str[i])) + return count - (i == 0 ? i : i - 1); } return count; } @@ -928,6 +952,61 @@ namespace stdex return strncmp(str1, N1, str2, N2); } + /// + /// Binary compare two strings + /// + /// \param[in] str1 String 1 + /// \param[in] count1 String 1 code unit count limit + /// \param[in] str2 String 2 + /// \param[in] count2 String 2 code unit count limit + /// + /// \return Negative if str1str2; zero if str1==str2 + /// + inline int strncmp( + _In_reads_or_z_opt_(count1) const utf32_t* str1, _In_ size_t count1, + _In_reads_or_z_opt_(count2) const utf16_t* str2, _In_ size_t count2) + { + _Assume_(str1 || !count1); + _Assume_(str2 || !count2); + size_t i, j, j_next; utf32_t a, b; + for (i = 0, j = 0; i < count1 && j < count2; ++i, j = j_next) { + a = str1[i]; + if (!a) + break; + if (j + 1 >= count2 || !is_surrogate_pair(&str2[j])) { + b = static_cast(str2[j]); + j_next = j + 1; + } + else { + b = surrogate_pair_to_ucs4(&str2[j]); + j_next = j + 2; + } + if (!b) + break; + if (a > b) return +1; + if (a < b) return -1; + } + if (i < count1 && str1[i]) return +1; + if (j < count2 && str2[j]) return -1; + return 0; + } + + /// + /// Binary compare two strings + /// + /// \param[in] str1 String 1 + /// \param[in] str2 String 2 + /// + /// \return Negative if str1str2; zero if str1==str2 + /// + template + int strncmp( + _In_ const utf32_t (&str1)[N1], + _In_ const utf16_t (&str2)[N2]) + { + return strncmp(str1, N1, str2, N2); + } + /// /// Binary compare two strings in reverse direction ///