2011-07-08 7 views
14

Wydaje się, że kod będzie katastrofy, kiedy zrobić extract<const char*>("a unicode string")jak wyodrębnić ciąg Unicode boost.python

Ktoś wie jak rozwiązać ten problem?

+0

Nie masz jednoznacznej odpowiedzi, ale [tutaj] (http://mail.python.org/pipermail/cplusplus-sig/2009-July/014720.html) i [tutaj] (http: // mail .python.org/pipermail/cplusplus-sig/2009-July/014664.html) Znalazłem kilka referencji, które mogą Cię zainteresować. – mac

+0

Czy to błąd? "TypeError: Żaden zarejestrowany konwerter nie był w stanie wyodrębnić wskaźnika C++ do typu char z tego obiektu Pythona typu unicode." Czy mógłbyś podać przykładowy kod i/lub dać pojęcie o tym, co próbujesz zrobić? –

+1

Czy możesz wyjaśnić pytanie? To naprawdę nie jest jasne. Jaki argument podajesz, aby wydobyć? Czy to ciąg dosłowny? A boost :: python :: object? – eudoxos

Odpowiedz

1

Czy próbowałeś

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

lub

extract<wchar_t*>(...) 
3

kompiluje i działa to dla mnie z przykładu ciąg i przy użyciu Pythona 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; 
} 

You można napisać a specific from-python converter, jeśli chcesz automatycznie konwertować PyUnicode (@ Python2.x) do const wchar_t* lub do typu z ICU (która wydaje się być powszechną rekomendacją do obsługi Unicode w C++).

Jeśli chcesz pełne wsparcie dla znaków Unicode, które nie znajdują się w zakresie ASCII (na przykład znaki diakrytyczne, takie jak á, ç lub ï, ty trzeba napisać konwerterem-python. Uwaga ta będzie miała należy to zrobić oddzielnie dla Pythona 2.x i 3.x, jeśli chcesz obsługiwać oba. Dla Python 3.x, PyUnicode type was deprecated, a teraz typ łańcucha działa jako PyUnicode używany do Pythona 2.x. Nic, co para z #if PY_VERSION_HEX >= 0x03000000 nie może obsłużyć .

[edycja]

Powyższy komentarz był nieprawidłowy. Zauważ, że ponieważ Python 3.x traktuje ciągi Unicode jak zwykłe łańcuchy, boost::python zapakuje je w obiekty boost::python::str. Nie sprawdziłem, jak są obsługiwane w.r.t. tłumaczenie unikodu w tym przypadku.