Funkcje c32rtomb
i mbrtoc32
z <cuchar>
/<uchar.h>
opisano C Unicode tR (draft), jak wykonywanie konwersji między UTF-32 i "postaci wielobajtowych".Jakie kodowanie jest konwertowane na c32rtomb?
(...) Jeśli
s
nie jest zerowy wskaźnik, funkcjac32rtomb
określa liczbę bajtów potrzebnych do reprezentowania znak wielobajtowy, która odpowiada szerokości znaku danego przezc32
(włącznie z sekwencjami zmianowych) i przechowuje wielobajtową reprezentację znaków w tablicy, której pierwszy element jest wskazywany przezs
. (...)
Co to jest "reprezentacja znaków wielobajtowych"? Właściwie jestem zainteresowany w zachowaniu następującego programu:
#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);
}
Czy twierdzenie w to gwarantowane trzymać ?
Praca przy założeniu, że __STDC_UTF_32__
jest zdefiniowana.
Dobra odpowiedź. Dla jasności: jeśli doda wezwanie do 'setlocale', to twierdzenie może się nie powieść, nawet jeśli jego ciągi są całkowicie w podstawowym zestawie znaków? – Nemo
@Nemo Jeśli 'setlocale()' zostało wywołane z argumentem innym niż '" C "', tak. Na przykład 'setlocale (" en_US.EBCDIC ")' (przyjmując, że jest to obsługiwana lokalizacja z oczywistym znaczeniem) w systemie, w którym kodowanie wykonania jest zgodne z ASCII, powodowałoby, że 'c32rtomb()' tworzyłby łańcuchy EBCDIC, podczas gdy 'std :: string narrow' pozostanie zakodowany w ASCII. – bames53