API non signée SQLite C / C ++ char *
Question
Pourquoi l'API SQLite C / C ++ renvoie-t-elle des caractères non signés *
pour les valeurs de texte, par opposition au type plus factuel char *
?
Ceci est en quelque sorte lié à la question sur le caractère non signé , sauf que la décision de l'API SQLite semble être à l'opposé de la question conventionnelle. char *
conseil donné pour les valeurs de type chaîne.
Par exemple:
const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);
La solution
De la documentation sur SQLite :
(H13821) L'interface sqlite3_column_text (S, N) convertit la Nième colonne de la ligne en cours de l'ensemble de résultats pour l'instruction S préparée en une chaîne UTF-8 à terminaison zéro et renvoie un pointeur sur cette chaîne.
UTF-8 veut des valeurs d’octets allant de 0x00 à 0xFF. Le caractère peut aller de -0x80 à 0x7F (signé) ou de 0x00 à 0xFF (non signé). Le fait de forcer non signé permet l'encodage correct d'une chaîne UTF-8.
Autres conseils
À première vue, je dirais que cela a quelque chose à voir avec le support du codage UTF-8. Les valeurs de caractères signés n'ont de sens que dans un environnement ASCII 7 bits où tout ce qui se situe au-dessus de 0x7f est ouvert à interprétation. Dans UTF-8, tout ce qui se situe entre 0x00 et 0xFF peut être utilisé de la même manière.