2013-09-26 5 views
5

Proprio ora sto cercando di usare libunistring nel mio programma c. Devo elaborare la stringa UTF-8, e per essa ho usato la funzione u8_strlen() dalla libreria libunistring.
Esempio di codice:libunistring u8_strlen() equivale a strlen()?

void print_length(uint8_t *msg) { 
    printf("Default strlen: %d\n", strlen((char *)msg)); 
    printf("U8 strlen: %d\n", u8_strlen(msg)); 
} 

Provate a immaginare che noi chiamiamo print_length() con msg = "привет" (, codifica UTF-8 cirillico). Mi aspettavo che strlen() restituisse 12 (6 lettere * 2 byte per lettera), e u8_strlen() dovrebbe restituire 6 (solo 6 lettere).

Ma ho ricevuto i risultati curiosi:

Default strlen: 12 
U8 strlen: 12 

Dopo questo ho cercato di ricercare realizzazione u8_strlen, e abbiamo trovato questo codice:

size_t 
u8_strlen (const uint8_t *s) 
{ 
    return strlen ((const char *) s); 
} 

mi chiedo, è esso bug o è la risposta corretta? Se è corretto, perché?

risposta

7

Credo che questo sia il comportamento previsto.

The libunistring manual dice che:

size_t u8_strlen (const uint8_t * s)

Restituisce il numero di unità in s.

anche nel manuale, si definisce cosa questa "unità" è:

UTF-8 corde, attraverso il tipo ‘uint8_t *’. Le unità sono byte (uint8_t).

Credo il motivo per cui etichettare la funzione u8_strlen anche se non fa altro che lo standard strlen è che la biblioteca ha anche u16_strlen e u32_strlen per funzionare con UTF-16 e UTF-32 stringhe, rispettivamente (che sarebbe conta il numero di unità da 2 byte fino a 0x0000 e le unità da 4 byte fino a 0x00000000) e hanno incluso u8_strlen semplicemente per completezza.

GNU gnulib fa tuttavia includono mbslen che probabilmente fa quello che si vuole:

funzione

mbslen: Determinare il numero di caratteri multibyte in una stringa.

0

Oltre alla risposta di Berry, osserverei che lo standard C consente di avere più di 8 bit in un carattere. Quindi strlen() restituirebbe la lunghezza in char, e non in blocchi a 8 bit, quindi sarebbe una frazione di ciò che restituisce u8_strlen() (o dovrebbe restituire - l'implementazione che hai mostrato ovviamente non funzionerebbe e darebbe la stessa risposta di strlen()) .