Const unsigned char * to std::string
sqlite3_column_text возвращает const unsigned char *, как мне преобразовать это в std::string? Я пробовал std::string(), но я получаю сообщение об ошибке.
код:
temp_doc.uuid = std::string(sqlite3_column_text(this->stmts.read_documents, 0));
Ошибка:
1>.\storage_manager.cpp(109) : error C2440: '<function-style-cast>' : cannot convert from 'const unsigned char *' to 'std::string'
1> No constructor could take the source type, or constructor overload resolution was ambiguous
Ответы
Ответ 1
Вы можете попробовать:
temp_doc.uuid = std::string(reinterpret_cast<const char*>(
sqlite3_column_text(this->stmts.read_documents, 0)
));
В то время как std::string
может иметь конструктор, который принимает const unsigned char*
, по-видимому, это не так.
Почему бы и нет? Вы можете посмотреть на этот несколько смежный вопрос: Почему потоки С++ используют char вместо unsigned char?
Ответ 2
В случайном случае вы действительно хотите строку без знаковых символов, вы можете создать свой собственный тип:
typedef std::basic_string <unsigned char> ustring;
Затем вы можете сказать такие вещи, как:
ustring s = sqlite3_column_text(this->stmts.read_documents, 0);
Ответ 3
Причина, по которой люди обычно используют тип (unsigned char *), указывает на то, что данные являются двоичными и не являются ASCII-текстом. Я знаю, что libxml делает это, и, по внешнему виду, sqlite делает то же самое.
Данные, которые вы возвращаете из вызова sqlite, вероятно, кодируются в кодировке Unicode, кодированной UTF-8. Хотя reinterpret_cast может работать, если кто-то когда-либо хранит текст в поле, которое не является простым ASCII, ваша программа, вероятно, не будет хорошо себя вести.
Класс std::string не разработан с учетом Unicode, поэтому, если вы запрашиваете длину() строки, вы получите количество байтов, которое в UTF-8 не обязательно является то же самое, что и количество символов.
Короткий ответ: простой актер может работать, если вы уверены, что данные - это просто ASCII. Если это могут быть любые данные UTF-8, тогда вам нужно более эффективно обрабатывать кодирование/декодирование.
Ответ 4
Я не знаком с sqlite3_column_text, но одна вещь, которую вы, возможно, захотите сделать, - это когда вы вызываете конструктор std: string, который вы хотите применить к (const char *). Я считаю, что он должен иметь конструктор для этого типа.
Однако нечетно, что эта функция sqlite возвращает unsigned char *, возвращает ли она строку Pascal (первая char - длина строки)? Если это так, тогда вам нужно будет создать std::string с байтами и длиной.
Ответ 5
попробовать:
temp_doc.uuid = std::string(reinterpret_cast<const char*>(sqlite3_column_text(this->stmts.read_documents, 0)));
Ответ 6
Вы не можете построить std::string
из c onst unsigned char*
- сначала вы должны перенести его на const char*
:
temp_doc.uuid = std::string( reinterpret_cast< const char* >(
sqlite3_column_text(this->stmts.read_documents, 0) ) );
Ответ 7
если temp_doc.uuid является std::string try:
temp_doc.uuid = static_cast<const char*>(sqlite3_column_text(this->stmts.read_documents, 0));
Ответ 8
Я не эксперт, но этот пример выглядит намного проще:
string name = (const char*) (sqlite3_column_text(res, 0));