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
答案 0 :(得分:47)
你可以尝试:
temp_doc.uuid = std::string(reinterpret_cast<const char*>(
sqlite3_column_text(this->stmts.read_documents, 0)
));
虽然std::string
可以有一个带const unsigned char*
的构造函数,但显然它没有。
为什么不呢?你可以看看这个有点相关的问题:Why do C++ streams use char instead of unsigned char?
答案 1 :(得分:19)
如果你真的想要一串无符号字符,你可以创建自己的类型:
typedef std::basic_string <unsigned char> ustring;
然后,您应该能够说出以下内容:
ustring s = sqlite3_column_text(this->stmts.read_documents, 0);
答案 2 :(得分:15)
人们通常使用(unsigned char *)类型的原因是为了表明数据是二进制而不是纯ASCII文本。我知道libxml会这样做,从它的外观来看,sqlite正在做同样的事情。
您从sqlite调用中获取的数据可能是UTF-8编码的Unicode文本。虽然reinterpret_cast似乎可以正常工作,但如果有人在非纯ASCII字段中存储文本,那么您的程序可能不会表现良好。
std :: string类在设计时没有考虑到Unicode,所以如果你要求字符串的length(),你将获得字节数,以UTF-8为单位,不一定与人物数量相同。
简短回答:如果您确定数据只是ASCII,那么简单的强制转换可能会起作用。如果它可以是任何UTF-8数据,那么您需要以更智能的方式处理编码/解码。
答案 3 :(得分:4)
我不熟悉sqlite3_column_text,但您可能要做的一件事是当您调用std:string构造函数时,您需要转换为(const char *)。我相信它应该有一个这种类型的构造函数。
然而,奇怪的是这个sqlite函数返回一个unsigned char *,它是否返回一个Pascal字符串(第一个char是字符串的长度)?如果是这样,那么你将不得不用字节和长度创建std :: string。
答案 4 :(得分:3)
尝试:
temp_doc.uuid = std::string(reinterpret_cast<const char*>(sqlite3_column_text(this->stmts.read_documents, 0)));
答案 5 :(得分:2)
您无法从c std::string
构建onst unsigned char*
- 您必须首先将其转换为const char*
:
temp_doc.uuid = std::string( reinterpret_cast< const char* >(
sqlite3_column_text(this->stmts.read_documents, 0) ) );
答案 6 :(得分:2)
如果temp_doc.uuid是std :: string,请尝试:
temp_doc.uuid = static_cast<const char*>(sqlite3_column_text(this->stmts.read_documents, 0));
答案 7 :(得分:2)
我不是专家,但这个例子似乎更简单:
string name = (const char*) (sqlite3_column_text(res, 0));
答案 8 :(得分:0)
一个古老但重要的问题,如果您必须将完整信息保留在未签名的char序列中。我认为,与reinterpret_cast无关。我在converting string to vector下找到了一个有趣的解决方案 我修改为
basic_string<unsigned char> temp = sqlite3_column_text(stmt, 0);
string firstItem( temp.begin(), temp.end() );
由于我正在为gtkmm编程,因此您可以使用
实现将其转换为Glib :: ustringbasic_string<unsigned char> temp = sqlite3_column_text(stmt, 0);
Glib::ustring firstItem = string( temp.begin(), temp.end() );