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
あなたが試すことができます:
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を使用するのですか?
偶然に、実際に符号なし文字のストリングが必要な場合は、独自のタイプを作成できます。
typedef std::basic_string <unsigned char> ustring;
その後、次のようなことを言うことができるはずです。
ustring s = sqlite3_column_text(this->stmts.read_documents, 0);
人々が通常(unsigned char *)型を使用する理由は、データがバイナリであり、プレーンではないことを示すためですASCII text。libxmlはこれを行うことを知っています。同じことをしています。
Sqlite呼び出しから返されるデータは、おそらくUTF-8でエンコードされたUnicodeテキストです。 reinterpret_castは機能しているように見えますが、プレーンASCII以外のフィールドに誰かがテキストを保存した場合、プログラムはおそらく正常に動作しません。
Std :: stringクラスはUnicodeを念頭に置いて設計されていないため、文字列のlength()を要求すると、バイト数が取得されます。これはUTF-8では必ずしも同じではありません文字数として。
簡単な答え:データが単なるASCIIであることが確実な場合、単純なキャストが機能する可能性があります。 UTF-8データを使用できる場合は、エンコード/デコードをよりスマートに処理する必要があります。
私はsqlite3_column_textに精通していませんが、std:stringコンストラクターを呼び出すときに、(const char *)にキャストすることをお勧めします。そのタイプのコンストラクタが必要だと思います。
しかし、このsqlite関数がunsigned char *を返すのは奇妙です、Pascal文字列を返しますか?(最初の文字は文字列の長さです)その場合、バイトと長さでstd :: stringを作成する必要があります。
試してください:
temp_doc.uuid = std::string(reinterpret_cast<const char*>(sqlite3_column_text(this->stmts.read_documents, 0)));
Cstd::string
からonst unsigned char*
を作成することはできません。最初にconst char*
にキャストする必要があります。
temp_doc.uuid = std::string( reinterpret_cast< const char* >(
sqlite3_column_text(this->stmts.read_documents, 0) ) );
temp_doc.uuidがstd :: string tryの場合:
temp_doc.uuid = static_cast<const char*>(sqlite3_column_text(this->stmts.read_documents, 0));
私は専門家ではありませんが、この例ははるかに簡単に見えます:
string name = (const char*) (sqlite3_column_text(res, 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() );