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>。
这里是一些在 utf8 中转换代码点(最高 0x10FFFF)的代码:
// 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,
buf, buf+sz, last_out);
sz = last_out - buf;
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)