Carattere non firmato API SQLite C / C ++ *
Domanda
Perché l'API di SQLite C / C ++ restituisce caratteri non firmati *
per valori di testo rispetto al tipo di fatto char *
?
Ciò è in qualche modo correlato alla la domanda di carattere non firmato , tranne per il fatto che la decisione dell'API di SQLite sembra opposta alla convenzionale char *
consigli forniti per valori simili a stringhe.
Ad esempio:
const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);
Soluzione
Dalla Documentazione SQLite :
(H13821) L'interfaccia sqlite3_column_text (S, N) converte l'ennesima colonna nella riga corrente del set di risultati per l'istruzione preparata S in una stringa UTF-8 con terminazione zero e restituisce un puntatore a quella stringa.
UTF-8 vuole valori di byte che vanno da 0x00 a 0xFF. il carattere può variare da -0x80 a 0x7F (con segno) o da 0x00 a 0xFF (senza segno). La forzatura di unsigned consente la codifica corretta di una stringa UTF-8.
Altri suggerimenti
Direi che ha qualcosa a che fare con il supporto della codifica UTF-8. I valori char firmati hanno senso solo in un ambiente ASCII a 7 bit in cui tutto sopra 0x7f è aperto all'interpretazione. In UTF-8 tutto tra 0x00 e 0xFF può essere usato allo stesso modo.