C ++ рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХрд╛ рдХрд╛рдо

рдмрд╣реБрдд рдкрд╣рд▓реЗ рдирд╣реАрдВ, рдореИрдВ рд╕реА + + рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХрд╛рдо рдХреЗ рдореБрджреНрджреЗ рд╕реЗ рд╣реИрд░рд╛рди рдерд╛ред рдпрд╣ рдХрд╛рд░реНрдп рдореЛрдЯреЗ рддреМрд░ рдкрд░ рдмреЛрд▓ рд░рд╣рд╛ рдерд╛, рдХрд┐рд╕реА рднреА рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рдХрд┐рд╕реА рднреА рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдореЗрдВ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдП рдХреЗрд╕-рдЕрд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЦреЛрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рддреЛ, рдкрд╣рд▓реА рдмрд╛рдд рдореБрдЭреЗ рдпрд╣ рд╕рдордЭрдиреА рдереА рдХрд┐ рд▓рд┐рдирдХреНрд╕ рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдЖрдкрдХреЛ UTF-8 рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдФрд░ рдЯрд╛рдЗрдк std :: string рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рд╡рд┐рдВрдбреЛрдЬ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдореЗрдВ UTF-16LE (рдЯрд╛рдЗрдк std :: wstring) рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреНрдпреЛрдВ? рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдбрд┐рдЬрд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рд╣реИред Std рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдирд╛ рдмреЗрд╣рдж рдорд╣рдВрдЧрд╛ рд╣реИ: рд▓рд┐рдирдХреНрд╕ рдореЗрдВ wstring, рдЪреВрдВрдХрд┐ рдПрдХ wchar_t рдХреИрд░реЗрдХреНрдЯрд░ 4 рдмрд╛рдЗрдЯреНрд╕ (рд╡рд┐рдВрдбреЛрдЬ рдореЗрдВ 2 рдмрд╛рдЗрдЯреНрд╕) рд▓реЗрддрд╛ рд╣реИ, рдФрд░ std :: рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд╡рд┐рдВрдбреЛрдЬ 98 рдХреЗ рджреМрд░рд╛рди рд╡рд┐рдВрдбреЛрдЬ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реЛрддреА рд╣реИред рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреЗ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо-рд╕реНрд╡рддрдВрддреНрд░ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред :

#ifdef _WIN32 typedef std::wstring mstring; #else typedef std::string mstring; #endif // _WIN32 


рджреВрд╕рд░рд╛ рдореИрдиреНрд╕реНрдЯреНрд░рд┐рдВрдЧ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдХрд┐рд╕реА рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рд╕реЗ рдХрдиреНрд╡рд░реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рдо рд╣реИред рдХрдИ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИрдВред рдкрд╣рд▓рд╛ рд╡рд┐рдХрд▓реНрдк std :: locale рдФрд░ рдЕрдиреНрдп рд╕рдВрдмрдВрдзрд┐рдд рдорд╛рдирдХ рдЪреАрдЬреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ charset'a рдЗрд╕реА рд▓реЛрдХреЗрд▓ (рдЬреИрд╕реЗ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ "рд╡рд┐рдВрдбреЛрдЬрд╝ -1251" рдХреЗ рд░реВрдк рдореЗрдВ рдЦреЛрдЬ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рддреБрд░рдВрдд рдорд╛рд░рд╛ рдЧрдпрд╛, рд▓реЛрдХрд▓ рд░рд╢рд┐рдпрди_рд░реВрд╕.1251, рдЖрджрд┐ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ)ред рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдРрд╕реА рддрд╛рд▓рд┐рдХрд╛ рдирд╣реАрдВ рдорд┐рд▓реА (рд╢рд╛рдпрдж рдпрд╣ рдмреБрд░реА рддрд░рд╣ рд╕реЗ рджрд┐рдЦ рд░рд╣реА рдереА?), рдореИрдВ рд╕реНрдерд╛рдиреЛрдВ рдХреА рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП рд▓реЛрд╢рди рдХреА рддрд▓рд╛рд╢ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рд╡реИрд╕реЗ рднреА, C ++ рдореЗрдВ рд▓реЛрдХреЗрд╢рдиреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рдмрд╣реБрдд рд╣реА рд╕реНрдкрд╖реНрдЯ рдмрд╛рдд рд╣реИред рдордВрдЪреЛрдВ рдиреЗ libiconv рдпрд╛ icu рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреАред libiconv рдмрд╣реБрдд рдЖрд╕рд╛рди рдФрд░ рд╕рд░рд▓ рд▓рдЧ рд░рд╣рд╛ рдерд╛, рдЗрд╕рдиреЗ рдХрд┐рд╕реА рднреА charset рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ mstring рдХреЛ рдЯреНрд░рд╛рдВрд╕рдХреЛрдбрд┐рдВрдЧ рдХрд╛ рдХрд╛рдо рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЬрдм рдпрд╣ mstring рдХреЛ рд▓реЛрдЕрд░ рдХреЗрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреА рдмрд╛рдд рдЖрдИ, рддреЛ рдореИрдВ рдЕрд╕рдлрд▓ рд░рд╣рд╛ред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд▓рд┐рдмреАрдХреЙрди рдХреЛ рдпрд╣ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рд▓рд┐рдирдХреНрд╕ рдореЗрдВ utf8 рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд▓реЛрдЕрд░ рдХреЗрд╕ рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдФрд░ рдЦреВрдмрд╕реВрд░рддреА рд╕реЗ рдирд╣реАрдВ рдмрджрд▓ рд╕рдХрд╛ред рддреЛ, рдЪреБрдирд╛рд╡ icu рдкрд░ рдЧрд┐рд░ рдЧрдпрд╛, рдЬрд┐рд╕рдиреЗ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ (рд░реВрдкрд╛рдВрддрд░рдг рдФрд░ рд▓реЛрдЕрд░рдХреЗрд╕ рдЕрдиреБрд╡рд╛рдж) рдХреЛ рд╕рдореНрдорд╛рдирдкреВрд░реНрд╡рдХ рд╣рд▓ рдХрд┐рдпрд╛ред рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо-рд╕реНрд╡рддрдВрддреНрд░ рдЯреНрд░рд╛рдВрд╕рдХреЛрдбрд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЖрдИрд╕реАрдпреВ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ:

 std::string to_utf8(const std::string& source_str, const std::string& charset, bool lowercase) { const std::string::size_type srclen = source_str.size(); std::vector<UChar> target(srclen); UErrorCode status = U_ZERO_ERROR; UConverter *conv = ucnv_open(charset.c_str(), &status); if (!U_SUCCESS(status)) return std::string(); int32_t len = ucnv_toUChars(conv, target.data(), srclen, source_str.c_str(), srclen, &status); if (!U_SUCCESS(status)) return std::string(); ucnv_close(conv); UnicodeString ustr(target.data(), len); if (lowercase) ustr.toLower(); std::string retval; ustr.toUTF8String(retval); return retval; } 


рдореИрдВ рд╡рд┐рдВрдбреЛрдЬ рдореЗрдВ рдпреВрдирд┐рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдореБрджреНрджреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ - рд╡рд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреНрд░рд▓реЗрдЦрд┐рдд рд╣реИред

Source: https://habr.com/ru/post/In145187/


All Articles