const unsigned char * std::string

sqlite3_column_text retourne un caractère non signé*, Comment puis-je le convertir en une chaîne std::? J'ai essayé std::string(), mais j'ai 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
34
demandé sur LM. 2009-04-30 00:28:18

9 réponses

Vous pouvez essayer:

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

alors que std::string pourrait avoir un constructeur qui prend const unsigned char* , apparemment il ne le fait pas.

Pourquoi pas, alors? Vous pouvez jeter un coup d'oeil à cette question un peu connexe: pourquoi les flux C++ utilisent char au lieu de char non signé?

41
répondu Reunanen 2017-05-23 11:54:34

si vous voulez 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);
18
répondu 2009-04-29 20:46:53

la raison pour laquelle les gens utilisent généralement un type (char non signé *) est d'indiquer que les données sont binaires et non pas un texte simple en ASCII. Je sais que libxml fait ça, et d'après ce que je vois, sqlite fait la même chose.

les données que vous récupérez à partir de l'appel sqlite sont probablement du texte Unicode encodé UTF-8. Alors qu'une réinterpret_cast peut sembler fonctionner, si quelqu'un stocke un texte dans le champ qui n'est pas ASCII, votre programme ne sera probablement pas bien comportée.

la classe std::string n'est pas conçue avec Unicode à l'esprit, donc si vous demandez la longueur() d'une chaîne, vous obtiendrez le nombre d'octets, qui, en UTF-8, n'est pas nécessairement la même chose que le nombre de caractères.

réponse courte: le cast simple peut fonctionner, si vous êtes certain que les données sont tout ASCII. Si cela peut être N'importe quelles données UTF-8, alors vous devez manipuler encodage/décodage d'une manière plus intelligente.

14
répondu Mike Mueller 2009-04-30 23:25:03

Je ne suis pas familier avec sqlite3_column_text, mais une chose que vous pourriez vouloir faire est quand vous appelez le constructeur std:string, vous voudrez lancer à (const char*). Je pense qu'il devrait y avoir un constructeur pour ce type.

cependant, il est étrange que cette fonction sqlite renvoie un char* non signé, renvoie-t-elle une chaîne Pascal (le premier char est la longueur de la chaîne)? Si c'est le cas, vous devrez créer la chaîne std::avec les octets et la longueur.

4
répondu Lyndsey Ferguson 2009-04-29 20:33:52

, essayez:

temp_doc.uuid = std::string(reinterpret_cast<const char*>(sqlite3_column_text(this->stmts.read_documents, 0)));
3
répondu user88637 2009-04-29 20:40:30

si temp_doc.l'uuid est un std::string essayer :

temp_doc.uuid = static_cast<const char*>(sqlite3_column_text(this->stmts.read_documents, 0));
2
répondu Raoul Supercopter 2009-04-29 20:34:20

vous ne pouvez pas construire un std::string de c onst unsigned char* -- vous devez le mouler à const char* d'abord:

temp_doc.uuid = std::string( reinterpret_cast< const char* >(
  sqlite3_column_text(this->stmts.read_documents, 0) ) );
2
répondu Kasprzol 2009-04-29 20:44:06

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

string name = (const char*) (sqlite3_column_text(res, 0));
2
répondu still_learning 2011-04-15 17:12:10

une question ancienne mais importante, si vous devez préserver l'information complète dans la séquence de caractères non signés. À mon avis, c'est avec réinterpret_cast pas le cas. J'ai trouvé une solution intéressante sous chaîne de conversion 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 un Glib:: ustring avec

basic_string<unsigned char> temp = sqlite3_column_text(stmt, 0);
Glib::ustring firstItem = string( temp.begin(), temp.end() );
0
répondu Erich Kuester 2018-07-30 17:53:21