Функции c32rtomb
и mbrtoc32
из <cuchar>
/<uchar.h>
описаны в C Unicode TR (проект) как выполнение преобразований между UTF-32 1 и "многобайтовые символы".
(...) Если
s
не является нулевым указатель, функцияc32rtomb
определяет количество байтов, необходимых для представления многобайтовый символ, который соответствует широкому символу, заданномуc32
(включая любые последовательности сдвигов) и сохраняет многобайтовое представление символа в массив, на первый элемент которого указанs
. (...)
Что это за "многобайтовое представление символов"? Меня действительно интересует поведение следующей программы:
#include <cassert>
#include <cuchar>
#include <string>
int main() {
std::u32string u32 = U"this is a wide string";
std::string narrow = "this is a wide string";
std::string converted(1000, '\0');
char* ptr = &converted[0];
std::mbstate_t state {};
for(auto u : u32) {
ptr += std::c32rtomb(ptr, u, &state);
}
converted.resize(ptr - &converted[0]);
assert(converted == narrow);
}
Утверждается ли в нем утверждение 1?
1 Работа в предположении, что __STDC_UTF_32__
определен.