SQLite C / C ++ API sin firmar char *
Pregunta
¿Por qué la API SQLite C / C ++ devuelve unsigned char *
s para valores de texto en oposición al tipo más de facto char *
?
Esto está algo relacionado con la pregunta unsigned char , excepto que la decisión de la API de SQLite parece opuesta a la convencional char *
consejos para valores similares a cadenas.
Por ejemplo:
const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);
Solución
Del documentación de SQLite :
(H13821) La interfaz sqlite3_column_text (S, N) convierte la enésima columna en la fila actual del conjunto de resultados para la instrucción preparada S en una cadena UTF-8 terminada en cero y devuelve un puntero a esa cadena.
UTF-8 quiere valores de bytes que van desde 0x00 a 0xFF. char puede variar de -0x80 a 0x7F (con signo) o 0x00 a 0xFF (sin signo). Forzar sin signo permite la codificación adecuada de una cadena UTF-8.
Otros consejos
Supongo que diría que tiene algo que ver con la compatibilidad con la codificación UTF-8. Los valores de caracteres firmados solo tienen sentido en un entorno ASCII de 7 bits donde todo por encima de 0x7f está abierto a interpretación. En UTF-8, todo entre 0x00 y 0xFF se puede utilizar por igual.