2011-07-08 21 views
14

Parece que el código se bloqueará cuando lo haga extract<const char*>("a unicode string")cómo extraer una cadena Unicode con Boost.Python

Alguien sabe cómo resolver esto?

+0

No tiene una respuesta definitiva, pero [aquí] (http://mail.python.org/pipermail/cplusplus-sig/2009-July/014720.html) y [aquí] (http: // mail .python.org/pipermail/cplusplus-sig/2009-July/014664.html) Encontré algunas referencias que pueden ser de su interés – mac

+0

¿Este es el error que está recibiendo? "TypeError: ningún convertidor registrado fue capaz de extraer un puntero C++ para escribir char de este objeto Python de tipo unicode". ¿Podría dar un código de ejemplo y/o dar una idea de lo que está tratando de hacer? –

+1

¿Puedes aclarar la pregunta? Realmente no está claro. ¿Cuál es el argumento que das para extraer? ¿Es una cadena literal? Un impulso :: python :: ¿objeto? – eudoxos

Respuesta

1

Ha intentado

extract<std::string>("a unicode string").c_str() 

o

extract<wchar_t*>(...) 
3

Esto compila y funciona para mí, con su ejemplo de cadena y el uso de Python 2.x:

void process_unicode(boost::python::object u) { 
    using namespace boost::python; 
    const char* value = extract<const char*>(str(u).encode("utf-8")); 
    std::cout << "The string value is '"<< value << "'" << std::endl; 
} 

Usted puede escribir a specific from-python converter, si desea convertir automáticamente PyUnicode (@ Python2.x) a const wchar_t* oa un tipo de ICU (que parece ser la recomendación común para tratar con Unicode en C++).

Si desea soporte completo a los caracteres Unicode que no están en el rango ASCII (por ejemplo, caracteres acentuados como á, ç o ï, que necesitarán para escribir el convertidor de-pitón. Tenga en cuenta que esto tiene para hacer por separado para Python 2.xy 3.x, si desea admitir ambos. Para Python 3.x, el PyUnicode type was deprecated y ahora el tipo de cadena funciona como PyUnicode para Python 2.x. Nada que un par de #if PY_VERSION_HEX >= 0x03000000 no puede manejar .

[editar]

El comentario anterior era incorrecto. Tenga en cuenta que, dado que Python 3.x trata las cadenas de Unicode como cadenas normales, boost::python ajustará eso en los objetos boost::python::str. No he verificado cómo se manejan esos w.r.t. traducción unicode en este caso.