C ++ 17 устарел, число удобных функций обработки utf. К сожалению, последние оставшиеся будут устаревшими в C ++ 20 (*) . Это сказанное std::codecvt
все еще в силе. От C ++ 11 до C ++ 17 вы можете использовать std::codecvt<char32_t, char, mbstate_t>
, начиная с C ++ 20 это будет std::codecvt<char32_t, char8_t, mbstate_t>
.
Вот код, преобразующий кодовую точку (до 0x10FFFF) в utf8:
// codepoint is the codepoint to convert
// buff is a char array of size sz (should be at least 4 to convert any code point)
// on return sz is the used size of buf for the utf8 converted string
// the return value is the return value of std::codecvt::out (0 for ok)
std::codecvt_base::result to_utf8(char32_t codepoint, char *buf, size_t& sz) {
std::locale loc("");
const std::codecvt<char32_t, char, std::mbstate_t> &cvt =
std::use_facet<std::codecvt<char32_t, char, std::mbstate_t>>(loc);
std::mbstate_t state{{0}};
const char32_t * last_in;
char *last_out;
std::codecvt_base::result res = cvt.out(state, &codepoint, 1+&codepoint, last_in,
c, c+sz, last_out);
sz = last_out - c;
return res;
}
(*) std::codecvt
все еще будет существовать в C ++ 20. Просто экземпляры по умолчанию больше не будут std::codecvt<char16_t, char, std::mbstate_t>
и std::codecvt<char32_t, char, std::mbstate_t>
, а std::codecvt<char16_t, char8_t, std::mbstate_t>
и std::codecvt<char32_t, char8_t, std::mbstate_t>
(примечание char8_t
вместо char
)