2014-11-23 14 views
5

io sono curioso di sapere come strlen contare i caratteri Unicode di più byte in C.come fa strlen unicode conteggio nel c

Ha conta ogni byte o un carattere (in quanto possono consistere di diversi byte) fino a prima ' \ 0' ?

+0

strlen funziona con byte. e alcuni caratteri unicode hanno '0x00' come primo byte, quindi 1) strlen è inutile per le stringhe Unicode. 2) ci sono funzioni disponibili per lavorare con caratteri multibyte: potresti voler usare una delle ampie funzioni char, come _mbstrnlen() o wcsnlen che è definita in string.h e wchar.h o mbstring.h – user3629249

risposta

6

strlen() conta il numero di byte finché non si incontra uno \0. Questo è vero per tutte le stringhe.

Per Unicode, si noti che il valore di ritorno di strlen() potrebbe essere interessato dal possibile byte esistente \0 in un carattere valido diverso dal terminatore null. Se UTF-8 viene utilizzato, va bene perché nessun carattere valido diverso da ASCII 0 può avere un byte \0, ma potrebbe non essere vero per altre codifiche.

+0

Sei sicuro che lì possono essere conflitti nelle stringhe Unicode con il carattere \ 0? Farà una nuova domanda correlata! –

+4

Dipende dal set di codici. Se utilizzi UTF-16, un carattere come U + 00FF (ÿ) sarà composto da un byte null e un byte 0xFF (in uno o nell'altro ordine, in base all'endianness: UTF-16LE o UTF-16BE) e il byte null fermerà 'strlen()' nelle sue tracce. Con UTF-32, il problema si verifica con ogni carattere Unicode poiché il valore massimo è U + 10FFFF, il che significa che c'è almeno un byte zero in ogni possibile valore Unicode a 4 byte. UTF-8 evita accuratamente questo problema; l'unica volta che viene visualizzato un byte zero è quando il carattere è U + 0000. –

2

strlen si applica solo alle stringhe, ovvero matrici con terminazione nulla di char. Tutte le codifiche multibyte consentite all'interno di stringhe hanno la proprietà che esse non contengono byte null interni, pertanto le funzioni strlen e altre str come strcat funzionano correttamente.

Se per "unicode" intendi matrici di wchar_t allora questo può contenere byte nulli, ma qui ancora una volta questo non è un problema, nessuno degli elementi wchar_t si sarà nullo. E non si dovrebbero applicare le funzioni str a tali matrici, esse non sono definite per esse.