49

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
4

9 回答 9

62

你可以试试:

temp_doc.uuid = std::string(reinterpret_cast<const char*>(
      sqlite3_column_text(this->stmts.read_documents, 0)
  ));

虽然std::string可以有一个构造函数,const unsigned char*但显然它没有。

那为什么不呢?你可以看看这个有点相关的问题:为什么 C++ 流使用 char 而不是 unsigned char?

于 2009-04-29T20:31:59.153 回答
22

如果您实际上想要一串无符号字符,则可以创建自己的类型:

typedef std::basic_string <unsigned char> ustring;

然后你应该可以说:

ustring s = sqlite3_column_text(this->stmts.read_documents, 0);
于 2009-04-29T20:46:53.360 回答
18

人们通常使用 (unsigned char *) 类型的原因是表明数据是二进制而不是纯 ASCII 文本。我知道 libxml 可以做到这一点,从外观上看,sqlite 也在做同样的事情。

您从 sqlite 调用返回的数据可能是 UTF-8 编码的 Unicode 文本。虽然 reinterpret_cast 可能看起来有效,但如果有人在非纯 ASCII 字段中存储文本,您的程序可能不会表现良好。

std::string 类在设计时并未考虑到 Unicode,因此如果您询问字符串的 length(),您将得到字节数,在 UTF-8 中,这不一定是同一件事作为字符数。

简短的回答:如果您确定数据只是 ASCII,那么简单的转换可能会起作用。如果它可以是任何 UTF-8 数据,那么您需要以更智能的方式处理编码/解码。

于 2009-04-30T23:25:03.240 回答
4

我不熟悉 sqlite3_column_text,但您可能想要做的一件事是当您调用 std:string 构造函数时,您需要转换为 (const char*)。我相信它应该有该类型的构造函数。

然而,奇怪的是这个 sqlite 函数返回一个无符号字符 *,它返回一个帕斯卡字符串(第一个字符是字符串的长度)吗?如果是这样,那么您必须使用字节和长度创建 std::string 。

于 2009-04-29T20:33:52.660 回答
3

如果 temp_doc.uuid 是 std::string 尝试:

temp_doc.uuid = static_cast<const char*>(sqlite3_column_text(this->stmts.read_documents, 0));
于 2009-04-29T20:34:20.130 回答
3

尝试:

temp_doc.uuid = std::string(reinterpret_cast<const char*>(sqlite3_column_text(this->stmts.read_documents, 0)));
于 2009-04-29T20:40:30.117 回答
2

您不能std::string从 c构造 a onst unsigned char*- 您必须const char*先将其转换为:

temp_doc.uuid = std::string( reinterpret_cast< const char* >(
  sqlite3_column_text(this->stmts.read_documents, 0) ) );
于 2009-04-29T20:34:11.880 回答
2

我不是专家,但这里的这个例子似乎更简单:

string name = (const char*) (sqlite3_column_text(res, 0));
于 2011-04-15T17:12:10.047 回答
0

一个古老但重要的问题,如果您必须保留 unsigned char 序列中的完整信息。在我看来,reinterpret_cast 并非如此。我在将字符串转换为 我修改为的向量下找到了一个有趣的解决方案

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() );
于 2018-07-30T17:53:21.240 回答