web-dev-qa-db-fra.com

const unsigned char * to std :: string

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

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?

44
Reunanen

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);
19
anon

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.

15
Mike Mueller

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.

4
Lyndsey Ferguson

essayer:

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

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) ) );
2
Kasprzol

si temp_doc.uuid est un std :: string, essayez:

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

Je ne suis pas un expert, mais cet exemple semble beaucoup plus simple:

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

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() );
0
Erich Kuester