Una stringa multibyte null-terminated (NTMBS), o "stringa multibyte", è una sequenza di byte non nulli seguita da un byte con valore zero (il carattere null terminante).

Ogni carattere memorizzato nella stringa può occupare più di un byte. La codifica utilizzata per rappresentare i caratteri in una stringa di caratteri multibyte è specifica del locale: può essere UTF-8, GB18030, EUC-JP, Shift-JIS, ecc. Ad esempio, l'array di caratteri {'xe4','xbd','xa0','xe5','xa5','xbd',''} è un NTMBS che contiene la stringa "你好" nella codifica multibyte UTF-8: i primi tre byte codificano il carattere 你, i tre byte successivi il carattere 好. La stessa stringa codificata in GB18030 è un array di caratteri {'xc4', 'xe3', 'xba', 'xc3', ''}, dove ciascuno dei due caratteri è codificato come una sequenza di due byte.

In alcune codifiche multibyte, una determinata sequenza di caratteri multibyte può rappresentare caratteri diversi a seconda delle sequenze di byte precedenti, note come "sequenze shift". Tali codifiche sono note come dipendenti dallo stato: per interpretare ogni carattere è necessario conoscere lo stato di spostamento corrente. Un NTMBS è valido solo se inizia e termina nello stato di shift iniziale: se è stata utilizzata una sequenza di shift, la corrispondente sequenza di unshift deve essere presente prima del carattere nullo finale. Esempi di codifiche di questo tipo sono BOCU-1 e SCSU.

Una stringa di caratteri multibyte è compatibile con le stringhe di byte null-terminated (NTBS), cioè può essere memorizzata, copiata ed esaminata utilizzando le stesse funzioni, tranne che per il calcolo del numero di caratteri. Se il locale è corretto, le funzioni di I/O gestiscono anche le stringhe multibyte. Le stringhe multibyte possono essere convertite in e da stringhe larghe utilizzando le seguenti funzioni di conversione dipendenti dal locale:

Conversioni multibyte/caratteri larghi

Definite nell'intestazione
mblen restituisce il numero di byte nel prossimo carattere multibyte
(funzione)
mbtowc converte il prossimo carattere multibyte in carattere largo
(funzione)
wctombwctomb_s(C11) converte un carattere largo nella sua rappresentazione multibyte
(funzione)
mbstowcsmbstowcs_s(C11) converte una stringa di caratteri multibyte stretta in stringa larga
(funzione)
wcstombswcstombs_s(C11) converte una stringa larga in una stringa stretta di caratteri multibyte
(funzione)
Definito nell'intestazione
mbsinit(C95) controlla se l'oggetto mbstate_t rappresenta lo stato di spostamento iniziale
(funzione)
btowc(C95) allarga un carattere stretto a singolo byte in un carattere largo, se possibile.
(funzione)
wctob(C95) restringe un carattere largo a un carattere stretto a singolo byte, se possibile.
(funzione)
mbrlen(C95) restituisce il numero di byte nel prossimo carattere multibyte, dato lo stato
(funzione)
mbrtowc(C95) converte il prossimo carattere multibyte in carattere largo, dato lo stato
(funzione)
wcrtombwcrtomb_s(C95)(C11) converte un carattere largo nella sua rappresentazione multibyte, dato lo stato
(funzione)
mbsrtowcsmbsrtowcs_s(C95)(C11) converte una stringa di caratteri multibyte stretta in stringa larga, dato lo stato
(funzione)
wcsrtombswcsrtombs_s(C95)(C11) converte una stringa larga in una stringa stretta di caratteri multibyte, dato lo stato
(funzione)
Definito nell'intestazione
mbrtoc16(C11) genera il successivo carattere a 16 bit di larghezza da una stringa stretta a più byte
(funzione)
c16rtomb(C11) converte un carattere largo 16 bit in una stringa stretta a più byte
(funzione)
mbrtoc32(C11) genera il successivo carattere largo 32 bit da una stringa stretta a più byte
(funzione)
c32rtomb(C11) converte un carattere largo 32 bit in una stringa stretta a più byte
(funzione)

Tipi

Definiti nell'intestazione
mbstate_t(C95) informazioni sullo stato di conversione necessarie per iterare stringhe di caratteri multibyte
(classe)
Definito nell'intestazione
char16_t(C11) Tipo di carattere a 16 bit
(typedef)
char32_t(C11) Tipo di carattere largo 32 bit
(typedef)

Macro

Definite nell'intestazione
MB_LEN_MAX Numero massimo di byte in un carattere multibyte, per qualsiasi locale supportato.
(costante macro)
Definito nell'intestazione
MB_CUR_MAX Numero massimo di byte in un carattere multibyte, nel locale corrente.
(variabile macro)
Definito nell'intestazione
__STDC_UTF_16__(C11) indica che la codifica UTF-16 è utilizzata da mbrtoc16 e c16rtomb
(costante macro)
__STDC_UTF_32__(C11) indica che la codifica UTF-32 è utilizzata da mbrtoc32 e c32rtomb
(costante macro)

Riferimenti

  • Norma C11 (ISO/IEC 9899:2011):
    • 7.10 Dimensioni dei tipi interi (p: 222)
    • 7.22 Utilità generali (p: 340-360)
    • 7.28 Utilità Unicode (p: 398-401)
    • 7.29 Utilità per caratteri estesi e multibyte (p: 402-446)
    • 7.31.12 Utilità generali (p: 456)
    • 7.31.16 Utilità per caratteri estesi e multibyte (p: 456)
    • K.3.6 Utilità generali (p: 604-614)
    • K.3.9 Utilità per caratteri estesi e multibyte (p: 627-651)
  • Standard C99 (ISO/IEC 9899:1999):
    • 7.10 Dimensioni dei tipi interi (p: 203)
    • 7.20 Utilità generali (p: 306-324)
    • 7.24 Utilità per caratteri estesi e multibyte (p: 348-392)
    • 7.26.10 Utilità generali (p: 402)
    • 7.26.12 Utilità per caratteri estesi e multibyte (p: 402)
  • Standard C89/C90 (ISO/IEC 9899:1990):
    • 4.1.4 Limiti e
    • 4.10 UTILITÀ GENERALI
    • 4.13.7 Utilità generali

Vedere anche