/ / wcstombs: codifica dei caratteri? - c, codifica dei caratteri

wcstombs: codifica dei caratteri? - c, codifica dei caratteri

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 № 1

Tu 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 modulo yyyymmL (per esempio, 199712L). Se questo simbolo è definito, ogni set nel set Unicode richiesto, se memorizzato in un oggetto di tipo wchar_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