Le funzioni c32rtomb
e mbrtoc32
da <cuchar>
/<uchar.h>
sono descritti nella C Unicode TR (draft) come eseguire conversioni tra UTF-32 e "caratteri multibyte".Quale codifica viene convertita in c32rtomb?
(...) Se
s
non è un puntatore nullo , la funzionec32rtomb
determina il numero di byte necessari per rappresentare carattere multibyte corrispondente al carattere esteso inc32
(comprese le sequenze di spostamento) e memorizza la rappresentazione del carattere multibyte in la matrice il cui primo elemento è puntato das
. (...)
Che cos'è questa "rappresentazione di carattere multibyte"? Sono davvero interessato al comportamento del seguente programma:
#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);
}
è l'affermazione in esso garantito per tenere ?
Lavorare sotto l'ipotesi che __STDC_UTF_32__
è definito.
Risposta piacevole. Giusto per essere chiari: se aggiunge una chiamata a 'setlocale', l'asserzione potrebbe fallire, anche se le sue stringhe sono interamente nel set di caratteri di base? – Nemo
@Nemo Se 'setlocale()' è stato chiamato con un argomento diverso da '" C "', sì. Per esempio 'setlocale (" en_US.EBCDIC ")' (supponendo che sia un locale supportato con il significato ovvio) su un sistema dove la codifica dell'esecuzione è compatibile ASCII causerebbe 'c32rtomb()' per produrre stringhe EBCDIC mentre 'std :: string narrow' resterebbe codificato ASCII. – bames53