web-dev-qa-db-ja.com

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
39
LM.

あなたが試すことができます:

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

std::stringには、const unsigned char*、明らかにそうではない。

ではなぜですか?あなたはこのやや関連する質問を見ることができます: なぜC++ストリームはunsigned charの代わりにcharを使用するのですか?

49
Reunanen

偶然に、実際に符号なし文字のストリングが必要な場合は、独自のタイプを作成できます。

typedef std::basic_string <unsigned char> ustring;

その後、次のようなことを言うことができるはずです。

ustring s = sqlite3_column_text(this->stmts.read_documents, 0);
20
anon

人々が通常(unsigned char *)型を使用する理由は、データがバイナリであり、プレーンではないことを示すためですASCII text。libxmlはこれを行うことを知っています。同じことをしています。

Sqlite呼び出しから返されるデータは、おそらくUTF-8でエンコードされたUnicodeテキストです。 reinterpret_castは機能しているように見えますが、プレーンASCII以外のフィールドに誰かがテキストを保存した場合、プログラムはおそらく正常に動作しません。

Std :: stringクラスはUnicodeを念頭に置いて設計されていないため、文字列のlength()を要求すると、バイト数が取得されます。これはUTF-8では必ずしも同じではありません文字数として。

簡単な答え:データが単なるASCIIであることが確実な場合、単純なキャストが機能する可能性があります。 UTF-8データを使用できる場合は、エンコード/デコードをよりスマートに処理する必要があります。

16
Mike Mueller

私はsqlite3_column_textに精通していませんが、std:stringコンストラクターを呼び出すときに、(const char *)にキャストすることをお勧めします。そのタイプのコンストラクタが必要だと思います。

しかし、このsqlite関数がunsigned char *を返すのは奇妙です、Pascal文字列を返しますか?(最初の文字は文字列の長さです)その場合、バイトと長さでstd :: stringを作成する必要があります。

4

試してください:

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

Cstd::stringからonst unsigned char*を作成することはできません。最初にconst char*にキャストする必要があります。

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

temp_doc.uuidがstd :: string tryの場合:

temp_doc.uuid = static_cast<const char*>(sqlite3_column_text(this->stmts.read_documents, 0));
2

私は専門家ではありませんが、この例ははるかに簡単に見えます:

string name = (const char*) (sqlite3_column_text(res, 0));
2
still_learning

古い情報ですが、重要な質問です。完全な情報を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() );
0
Erich Kuester