wcstombs documentazione dice, "converte la sequenza di codici a caratteri grandi in stringa multibyte". Ma non dice mai che cosa sia un "personaggio ampio".
È implicito, come dire che converte utf-16 in utf-8 o la conversione è definita da una variabile d'ambiente?
Inoltre, qual è il tipico caso d'uso di wcstombs?
risposte:
4 per risposta № 1Tu usi il setlocale()
funzione standard con LC_CTYPE
(o LC_ALL
) categoria per impostare la mappatura utilizzata dalla libreria wchar_t
personaggi e personaggi multibyte. Il nome della locale attuale è passato a setlocale()
è l'implementazione definita, quindi dovrai cercarla nei documenti del tuo compilatore.
Ad esempio, con MSVC potresti usare
setlocale( LC_ALL, ".1252" );
per impostare il runtime C in modo da utilizzare la codepage 1252 come set di caratteri multibyte. Si noti che i documenti MSVC indicano esplicitamente che le impostazioni internazionali non possono essere impostate su UTF-7 o UTF8 per i set di caratteri multibyte:
L'insieme delle lingue disponibili, paese / regionei codici e le pagine di codice includono tutti quelli supportati dall'API NLS Win32 tranne le pagine di codice che richiedono più di due byte per carattere, come UTF-7 e utf-8. Se si fornisce una tabella codici come UTF-7 o utf-8, setlocale fallirà, restituendo NULL.
Il "personaggio largo" wchar_t
type è pensato per supportare qualsiasi set di caratteri supportato dal sistema - lo standard non definisce la dimensione di a wchar_t
tipo (potrebbe essere piccolo come a char
o uno dei più grandi tipi di numeri interi). Su Windows è la codifica Unicode "interna" del sistema, che è UTF-16 (UCS-2 prima di WinXP). Onestamente, non riesco a trovare una citazione diretta su questo nei documenti di MSVC. A rigor di termini, l'implementazione dovrebbe richiamarlo, ma non riesco a trovarlo.
3 per risposta № 2
Converte qualunque cosa usi la tua piattaforma per a"wide char" (di cui sto inducendo a credere sia effettivamente UCS2 su Windows, ma di solito è UCS4 su UNIX) nella codifica dei caratteri multibyte predefinita della tua locale attuale. Se la tua locale è utf-8, allora quella sarà la codifica multibyte che verrà usata - ma nota che ci sono altre possibilità, come JIS.
1 per risposta № 3
Secondo lo standard C, wchar_t
type è "in grado di rappresentare qualsiasi carattere nella locale corrente". Lo standard non dice a cosa serve la codifica wchar_t
è. In effetti, i limiti WCHAR_MIN
e WCHAR_MAX
siamo [0
, 255
] o [-127, 127], a seconda che wchar_t
non è firmato o firmato.
Un carattere multibyte può usare più di un byte. Una stringa multibyte è composta da uno o più caratteri multibyte. In una stringa multibyte, ogni carattere non deve necessariamente avere lo stesso numero di byte (utf-8 è un esempio). Considerando che un oggetto di tipo wchar_t
ha una dimensione fissa (in una data implementazione, ovviamente).
A parte, posso anche trovare quanto segue nella mia copia del progetto C99:
__STDC_ISO_10646__
Una costante intera del moduloyyyymmL
(per esempio,199712L
). Se questo simbolo è definito, ogni set nel set Unicode richiesto, se memorizzato in un oggetto di tipowchar_t
, ha lo stesso valore dell'identificatore breve diquel personaggio. Il set richiesto Unicode è composto da tutti i caratteri definiti da ISO / IEC 10646, insieme a tutte le modifiche e rettifiche tecniche, a partire dall'anno e dal mese specificati.
Quindi, se ho capito bene, se __STDC_ISO_10646__
è definito, quindi wchar_t
può memorizzare caratteri Unicode.
1 per risposta № 4
Le stringhe di caratteri estese sono composte da multi-bytecaratteri, mentre la normale stringa C è un carattere * - una sequenza di caratteri a livello di byte. Wchars non è la stessa cosa di unicode su tutte le piattaforme, anche se le rappresentazioni di unicode sono in genere basate su wchar_t
Ho visto wchars usati in sistemi embedded come i telefoni, dove vuoi nomi di file con caratteri speciali ma non vuoi necessariamente supportare tutta la gloria e la complessità dell'unicode.
L'uso tipico sarebbe la conversione di una stringa basata su 2 byte in una normale stringa C, e viceversa