рдХрднреА-рдХрднреА рдЖрдкрдХреЛ рдХреЙрдорд░реЗрдбреЛрдВ рд╕реЗ рд╕реБрдирдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЧрдпрд╛ рдерд╛ рдЬреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдЙрд▓рдЯ рджреЗрдЧрд╛ред рдФрд░ рдХреЛрдбрд┐рдВрдЧ рдЗрдВрдЯрд░рд╡реНрдпреВ рдХреЛ рдХреНрд░реИрдХ рдХрд░рдиреЗ рдореЗрдВ рднреА , рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдпрд╣ рджреВрд╕рд░рд╛ рдкреНрд░рд╢реНрди рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рд╣реА рд╕рдорд╛рдзрд╛рди, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЙрд▓ рдпрд╛ рд▓реВрдк рдХрд░рддреЗ рд╕рдордп рдПрдХ рд╕реЗ рдкрд░реЗ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЬрд╣рд╛рдВ рдкреНрд░реЗрд╖рд┐рдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рдПрдХ ASCII рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ, рд╕рдмрд╕реЗ рд╕рд░рд▓ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рд▓реЗрдХрд┐рди рд╕рдм рдХреБрдЫ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЕрдЧрд░ рдПрдХ UTF-8 рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЗрдирдкреБрдЯ рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рд╕рд╛рде рдпрд╣рд╛рдБ рджреЛ рд╕рдорд╕реНрдпрд╛рдПрдБ рд╣реИрдВ: рдЪрд░ рдЪреМрдбрд╝рд╛рдИ рдФрд░ рд╕рдВрд╢реЛрдзрд┐рдд рд╡рд░реНрдг ред
рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЙрди рдкрд░реАрдХреНрд╖рдгреЛрдВ рд╕реЗ рд╢реБрд░реВ рдХрд░реВрдБрдЧрд╛ рдЬреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдкрд╛рд╕ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП (рдмрд╛рдИрдВ рдУрд░ рдЗрдирдкреБрдЯ рд╣реИ, рджрд╛рдИрдВ рдУрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рдирд┐рдХрд╛рд╕ рд╣реИ):
const char* cases[][2] = { // ascii- {"", ""}, {"a", "a"}, {"ab", "ba"}, {"a b", "b a"}, // , UTF-8 {"\xd1\x84", "\xd1\x84"}, // {"x\xd1\x84", "\xd1\x84x"}, {"y\xd1\x84z", "z\xd1\x84y"}, {"\xd1\x84\xd1\x85", "\xd1\x85\xd1\x84"}, // , {"\xd0\x98\xcc\x86", "\xd0\x98\xcc\x86"}, // {"i\xd0\x98\xcc\x86", "\xd0\x98\xcc\x86i"}, {"\xd0\x98\xcc\x86i", "i\xd0\x98\xcc\x86"}, {"\xd0\x98\xcc\x86\xd1\x84", "\xd1\x84\xd0\x98\xcc\x86"}, // : z╠Ж╠Иy {"z\xd0\x98\xcc\x86\xcc\x88y", "y\xd0\x98\xcc\x86\xcc\x88z"} };
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдпреВрдирд┐рдХреЛрдб "рд╣реБрдб рдХреЗ рдиреАрдЪреЗ рд╣реИред" рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░реА, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдИрд╕реАрдпреВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рд╛рде рдирд┐рд╣рд┐рдд рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рдиреЛрдЯ рдХреЛ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдИрд╕реАрдпреВ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдореЗрд░реА рддрд░рд╣, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред
рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛
рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдирд┐рдореНрди рдЪрд░рдгреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:- рдПрдХ рдХреВрдЯ-рд╕реНрд╡рддрдВрддреНрд░ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ UTF-8 рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдбрд┐рдХреЛрдб рдХрд░реЗрдВ,
- рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдмрд╛рдж рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВ рддрд╛рдХрд┐ рд╕рднреА рдЧреИрд░-рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╡рд░реНрдг рдФрд░ рдХреЗрд╡рд▓ рд╡реЗ рдЕрдкрдиреЗ рдЖрдзрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдХреНрд░рдо рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдВ,
- рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рдмрд╛рдж рдХреЗ рдкреБрди: рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░реЗрдВ,
- UTF-8 рдореЗрдВ рд╡рд╛рдкрд╕ рдХрдирд╡рд░реНрдЯ рдХрд░реЗрдВред
рдбреЗрдЯрд╛ рд░реАрдбрд┐рдВрдЧ
Icu :: UnicodeString рд╡рд░реНрдЧ рдореЗрдореЛрд░реА рдореЗрдВ рдбреЗрдЯрд╛ рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд╛ рдПрдХ рдЕрдореВрд░реНрдд рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдпреВрдирд┐рдХреЛрдб рд╡рд░реНрдгреЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЗ рд░реВрдк рдореЗрдВ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдФрд░ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдореБрдЭреЗ рдЗрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА: // Decoding icu::UnicodeString s = icu::UnicodeString::fromUTF8(cases[test_case][0]); // Encoding std::string result; s.toUTF8String(result);
рдЪрд░рд┐рддреНрд░ рднреЗрдж
Icu :: BreakIterator class рдЖрдкрдХреЛ UnicodeString рдореЗрдВ рдЕрдЧрд▓реЗ / рдкрд┐рдЫрд▓реЗ Extended_character / рд╢рдмреНрдж / рд╡рд╛рдХреНрдп рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рдХреНрд░реЛрдорд┐рдпрдо рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдФрд░ рдЗрд╕рдХреЗ рдбреЗрд░рд┐рд╡реЗрдЯрд┐рд╡ рдореЗрдВ рдПрдХ рдкреГрд╖реНрда рдЦреЛрдЬрддреЗ рд╕рдордп рдпрд╣ рдкрд╛рда рд╢рдмреНрджреЛрдВ рдореЗрдВ рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИ)ред рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдареАрдХ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдкрд╛рда рдХреА рднрд╛рд╖рд╛ рдХреЛ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рд┐рдПред // Initialize iterator UErrorCode ec = U_ZERO_ERROR; icu::Locale ru_locale = icu::Locale("ru"); std::unique_ptr<icu::BreakIterator> iter; iter.reset(icu::BreakIterator::createCharacterInstance(ru_locale, ec)); iter->setText(my_unicode_string); // Set it to the beginning of my_unicode_string and get next character's position iter->first(); int32_t next_char = iter->next(); // Or set it to the after-last-character position and get previous character position iter->last(); int32_t this_char = iter->previous();