Vediamo se riesco a chiarire la situazione:
"stringa di caratteri multi-byte" è un termine vago per cominciare, ma nel mondo di Microsoft, è meants tipicamente "non ASCII, e non UTF 16" . Quindi, potresti usare una codifica di caratteri che potrebbe usare 1 byte per carattere, o 2 byte, o forse più. Non appena lo fai, il numero di caratteri nella stringa! = Il numero di byte nella stringa.
Prendiamo UTF-8 come esempio, anche se non è utilizzato su piattaforme MS. Il carattere é è codificato come "c3 a9" in memoria - quindi, due byte, ma 1 carattere. Se ho la "I" stringa, è:
text: t h é \0
mem: 74 68 c3 a9 00
Questo è un "nullo terminata" stringa, in quanto termina con un nullo. Se volessimo permettere nostra stringa di avere valori nulli in essa, avremmo bisogno di memorizzare la dimensione in qualche altro modo, come ad esempio:
struct my_string
{
size_t length;
char *data;
};
... e una serie di funzioni per contribuire ad affrontare questo. (Questa è una sorta di come std::string
opere, piuttosto grossolanamente.)
Per stringhe null-terminated, tuttavia, strlen()
calcolerà la loro dimensione in byte , caratteri non. (Ci sono altre funzioni per il conteggio dei caratteri) strlen
conta il numero di byte prima di vedere un byte 0 - niente di strano.
Ora, le stringhe "wide" o "unicode" nel mondo di MS si riferiscono alle stringhe UTF-16. Hanno problemi simili in quanto il numero di byte! = Il numero di caratteri. (Anche: il numero di byte/2 = il numero di caratteri!) Lasciate guardare il nuovo:
text: t h é \0
shorts: 0x0074 0x0068 0x00e9 0x0000
mem: 74 00 68 00 e9 00 00 00
Questo è "il" in UTF-16, memorizzata in little endian (che è ciò che il vostro desktop tipico è). Si noti tutti i 00 byte - questi trip up strlen. Quindi, chiamiamo wcslen
, che lo considera come 2 byte short
s, non singoli byte.
Infine, si dispone di TCHAR
s, che sono uno dei due casi precedenti, a seconda se è stato definito UNICODE
. _tcslen
sarà la funzione appropriata (strlen
o wcslen
) e TCHAR
sarà char
o wchar_t
. TCHAR
è stato creato per facilitare il passaggio a UTF-16 nel mondo Windows.
Il codice è corretto, per il calcolo della dimensione, in byte, della stringa. L'affermazione "funziona per ... char e wchar_t ... ma non per le stringhe di caratteri multibyte" è tuttavia confusa. – Thanatos
Quindi le stringhe di caratteri multibyte non contengono byte null? – flacs
@Tilka: Potrebbero, ma è necessario conoscere la lunghezza in qualche altro modo, ad esempio memorizzarlo in un numero intero che viene fornito con la stringa. Stringhe terminate da null, che sono quelle che normalmente si incontrano (e cosa richiedono _tcslen, strlen, etc.), non contengono byte null, ad eccezione del terminatore null, ovviamente. – Thanatos