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
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é?
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.
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.
, essayez:
temp_doc.uuid = std::string(reinterpret_cast<const char*>(sqlite3_column_text(this->stmts.read_documents, 0)));
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));
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) ) );
Je ne suis pas un expert mais cet exemple ici semble beaucoup plus simple:
string name = (const char*) (sqlite3_column_text(res, 0));
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() );