SQLite C / C ++ API unsigned char *
Вопрос
Почему API SQLite C / C ++ возвращает unsigned char *
для текстовых значений, в отличие от более фактического типа char *
?
Это в некоторой степени связано с вопросом о unsigned char , за исключением того, что решение API SQLite кажется противоположным общепринятому char *
совет для строковых значений.
Например:
const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);
Решение
Из документации SQLite :
(H13821) Интерфейс sqlite3_column_text (S, N) преобразует N-й столбец в текущей строке набора результатов для подготовленного оператора S в строку UTF-8 с нулевым символом в конце и возвращает указатель на эту строку. р>
UTF-8 хочет значения байтов в диапазоне от 0x00 до 0xFF. char может варьироваться от -0x80 до 0x7F (со знаком) или от 0x00 до 0xFF (без знака). Формирование без знака позволяет правильно кодировать строку UTF-8.
Другие советы
Я бы сказал, что это связано с поддержкой кодировки UTF-8. Значения со знаком со знаком имеют смысл только в 7-битной среде ASCII, где все, что выше 0x7f, открыто для интерпретации. В UTF-8 все между 0x00 и 0xFF может использоваться одинаково.