const unsigned char * to std :: string

时间:2009-04-29 20:28:19

标签: c++ std

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

9 个答案:

答案 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 :: ustring
basic_string<unsigned char> temp = sqlite3_column_text(stmt, 0);
Glib::ustring firstItem = string( temp.begin(), temp.end() );