sqlite3_column_text retourne un caractère * non signé, comment puis-je le convertir en std :: string? J'ai essayé std :: string (), mais j'obtiens une erreur.
Code:
temp_doc.uuid = std::string(sqlite3_column_text(this->stmts.read_documents, 0));
Erreur:
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
Tu pourrais essayer:
temp_doc.uuid = std::string(reinterpret_cast<const char*>(
sqlite3_column_text(this->stmts.read_documents, 0)
));
Bien que std::string
puisse avoir un constructeur prenant const unsigned char*
, apparemment ce n’est pas le cas.
Pourquoi pas alors? Vous pouvez consulter cette question un peu connexe: Pourquoi les flux C++ utilisent-ils char au lieu de unsigned?
Si vous préférez une chaîne de caractères non signés, vous pouvez créer votre propre type:
typedef std::basic_string <unsigned char> ustring;
Vous devriez alors pouvoir dire des choses comme:
ustring s = sqlite3_column_text(this->stmts.read_documents, 0);
La raison pour laquelle les utilisateurs utilisent généralement un type (unsigned char *) est d'indiquer que les données sont du texte binaire et non du texte brut ASCII. Je sais que libxml fait cela et, à première vue, sqlite fait la même chose.
Les données que vous récupérez de l'appel sqlite sont probablement du texte Unicode codé en UTF-8. Tandis qu'une réinterprétion_cast peut sembler fonctionner, si quelqu'un stocke du texte dans le champ qui n'est pas en ASCII simple, votre programme ne sera probablement pas bien tenu.
La classe std :: string n'est pas conçue pour Unicode, donc si vous demandez la longueur () d'une chaîne, vous obtiendrez le nombre d'octets, ce qui, en UTF-8, n'est pas nécessairement la même chose. comme le nombre de caractères.
Réponse courte: la distribution simple peut fonctionner, si vous êtes certain que les données ne sont que de l'ASCII. S'il peut s'agir de données UTF-8, vous devez gérer l'encodage/décodage de manière plus intelligente.
Sqlite3_column_text n'est pas familier, mais vous voudrez peut-être que lorsque vous appelez le constructeur std: string, vous souhaitiez effectuer un transtypage vers (const char *). Je crois qu'il devrait avoir un constructeur pour ce type.
Cependant, il est étrange que cette fonction sqlite renvoie un caractère non signé *, renvoie-t-elle une chaîne Pascal (le premier caractère est la longueur de la chaîne)? Si c'est le cas, vous devrez créer std :: string avec les octets et la longueur.
essayer:
temp_doc.uuid = std::string(reinterpret_cast<const char*>(sqlite3_column_text(this->stmts.read_documents, 0)));
Vous ne pouvez pas construire un std::string
à partir de const unsigned char*
- vous devez d'abord le convertir en const char*
:
temp_doc.uuid = std::string( reinterpret_cast< const char* >(
sqlite3_column_text(this->stmts.read_documents, 0) ) );
si temp_doc.uuid est un std :: string, essayez:
temp_doc.uuid = static_cast<const char*>(sqlite3_column_text(this->stmts.read_documents, 0));
Je ne suis pas un expert, mais cet exemple semble beaucoup plus simple:
string name = (const char*) (sqlite3_column_text(res, 0));
Une question ancienne mais importante, si vous devez conserver les informations complètes dans la séquence de caractères non signés. A mon avis, c'est avec reinterpret_cast pas le cas. J'ai trouvé une solution intéressante sous conversion de chaîne en vecteur Que j'ai modifié en
basic_string<unsigned char> temp = sqlite3_column_text(stmt, 0);
string firstItem( temp.begin(), temp.end() );
Depuis que je programme pour gtkmm, vous pouvez réaliser la conversion en Glib :: ustring avec
basic_string<unsigned char> temp = sqlite3_column_text(stmt, 0);
Glib::ustring firstItem = string( temp.begin(), temp.end() );