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);
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top