const unsigned char * to std:: string
Sqlite3_column_text devuelve un carácter const sin signo*, ¿cómo convertir esto a una cadena std::? He intentado std:: string(), pero recibo un error.
Código:
temp_doc.uuid = std::string(sqlite3_column_text(this->stmts.read_documents, 0));
Error:
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 answers
Puedes intentar:
temp_doc.uuid = std::string(reinterpret_cast<const char*>(
sqlite3_column_text(this->stmts.read_documents, 0)
));
Mientras que std::string
podría tener un constructor que toma const unsigned char*
, aparentemente no lo hace.
¿Por qué no, entonces? Podría echar un vistazo a esta pregunta algo relacionada: ¿Por qué los flujos de C++ usan char en lugar de char sin signo?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:34
En la remota posibilidad de que realmente desee una cadena de caracteres sin signo, puede crear su propio tipo:
typedef std::basic_string <unsigned char> ustring;
Entonces deberías ser capaz de decir cosas como:
ustring s = sqlite3_column_text(this->stmts.read_documents, 0);
La razón por la que las personas suelen usar un tipo (unsigned char *) es para indicar que los datos son binarios y no texto ASCII simple. Sé que libxml hace esto, y por lo que parece, sqlite está haciendo lo mismo.
Los datos que está recibiendo de la llamada sqlite es probablemente texto Unicode codificado en UTF-8. Si bien un reinterpret_cast puede parecer que funciona, si alguien alguna vez almacena texto en el campo que no es ASCII simple, su programa probablemente no se comportará bien.
La cadena std:: class no está diseñada con Unicode en mente, así que si preguntas por la longitud() de una cadena, obtendrás el número de bytes, que, en UTF-8, no es necesariamente lo mismo que el número de caracteres.
Respuesta corta: el cast simple puede funcionar, si está seguro de que los datos son solo ASCII. Si puede ser cualquier dato UTF-8, entonces necesita manejar la codificación/decodificación de una manera más inteligente.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-30 23:25:03
No estoy familiarizado con sqlite3_column_text, pero una cosa que puede querer hacer es cuando llama al constructor std:string, querrá convertir a (const char*). Creo que debería tener un constructor para ese tipo.
Sin embargo, es extraño que esta función sqlite devuelva un char sin signo*, ¿está devolviendo una cadena Pascal (el primer char es la longitud de la cadena)? Si es así, entonces tendrás que crear la cadena std::con los bytes y la longitud.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-29 20:33:52
Intenta:
temp_doc.uuid = std::string(reinterpret_cast<const char*>(sqlite3_column_text(this->stmts.read_documents, 0)));
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-29 20:40:30
Si temp_doc.uuid es una cadena std:: try:
temp_doc.uuid = static_cast<const char*>(sqlite3_column_text(this->stmts.read_documents, 0));
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-29 20:34:20
No puedes construir un std::string
desde c onst unsigned char*
first primero tienes que lanzarlo a const char*
:
temp_doc.uuid = std::string( reinterpret_cast< const char* >(
sqlite3_column_text(this->stmts.read_documents, 0) ) );
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-29 20:44:06
No soy un experto, pero este ejemplo aquí parece mucho más simple:
string name = (const char*) (sqlite3_column_text(res, 0));
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-15 17:12:10
Una pregunta antigua pero importante, si tiene que preservar la información completa en la secuencia de caracteres sin signo. En mi opinión, con reinterpret_cast no es el caso. Encontré una solución interesante bajo convertir cadena a vector que he modificado a
basic_string<unsigned char> temp = sqlite3_column_text(stmt, 0);
string firstItem( temp.begin(), temp.end() );
Ya que estoy programando para gtkmm, puede realizar la conversión en un Glib:: ustring con
basic_string<unsigned char> temp = sqlite3_column_text(stmt, 0);
Glib::ustring firstItem = string( temp.begin(), temp.end() );
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-30 17:53:21